/ Hex Artifact Content
Login

Artifact aa29f273fe701be7d7653fe47431762b11d2f58c:


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 34  : pager.c,v 1.44
0350: 36 20 32 30 30 38 2f 30 35 2f 31 33 20 31 33 3a  6 2008/05/13 13:
0360: 32 37 3a 33 34 20 64 72 68 20 45 78 70 20 24 0a  27:34 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  its argument. Th
0690: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
06a0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
06b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c  is returned. FIL
06c0: 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65  EHANDLEID() take
06d0: 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  s an sqlite3_fil
06e0: 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69  e.** struct as i
06f0: 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ts argument..*/.
0700: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0710: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0720: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0730: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0740: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0750: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0760: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0770: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0780: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0790: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
07a0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
07b0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07c0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07d0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
0800: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0810: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0840: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0850: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0860: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0870: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0880: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0890: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
08a0: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
08b0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08c0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08e0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08f0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
0900: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0920: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0930: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0940: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0970: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0980: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0990: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
09a0: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
09b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09c0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09f0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
0a00: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0a10: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a30: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a40: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a50: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a70: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a80: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a90: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0aa0: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ad0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ae0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b20: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b40: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b50: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b80: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b90: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0bc0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bd0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0be0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bf0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0c00: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0c10: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c20: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c30: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c40: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c50: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c80: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c90: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0ca0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0cc0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cd0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0ce0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0d10: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d20: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f  o is to remove o
0d30: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0d40: 20 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63             trunc
0d50: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
0d60: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61  file and the tra
0d70: 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  nsaction .**    
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69     will be commi
0da0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0db0: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0dc0: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0dd0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0de0: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0df0: 33 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75  3PagerGet() occu
0e00: 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  rs, the state tr
0e10: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e20: 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66  ER_SHARED..** Af
0e30: 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61  ter all pages ha
0e40: 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ve been released
0e50: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61   using sqlite_pa
0e60: 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74  ge_unref(),.** t
0e70: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0e80: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47  ions back to PAG
0e90: 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  ER_UNLOCK.  The 
0ea0: 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68  first time.** th
0eb0: 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  at sqlite3PagerW
0ec0: 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
0ed0: 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  , the state tran
0ee0: 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41  sitions to.** PA
0ef0: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28  GER_RESERVED.  (
0f00: 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65  Note that sqlite
0f10: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61  3PagerWrite() ca
0f20: 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c  n only be.** cal
0f30: 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61  led on an outsta
0f40: 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68  nding page which
0f50: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
0f60: 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65  pager must.** be
0f70: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
0f80: 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73   before it trans
0f90: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0fa0: 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41  RESERVED.).** PA
0fb0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61  GER_RESERVED mea
0fc0: 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
0fd0: 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63   an open rollbac
0fe0: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68  k journal..** Th
0ff0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  e transition to 
1000: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1010: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e  occurs before an
1020: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
1030: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1040: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75  abase file, thou
1050: 67 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  gh writes to the
1060: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1070: 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68  rnal occurs with
1080: 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45   just PAGER_RESE
1090: 52 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20  RVED.  After an 
10a0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
10b0: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
10c0: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
10d0: 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73  haseTwo(), the s
10e0: 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b  tate can go back
10f0: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1100: 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73  ,.** or it can s
1110: 74 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43  tay at PAGER_EXC
1120: 4c 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65  LUSIVE if we are
1130: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
1140: 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64  cess mode..*/.#d
1150: 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f  efine PAGER_UNLO
1160: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
1170: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20  e PAGER_SHARED  
1180: 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20      1   /* same 
1190: 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  as SHARED_LOCK *
11a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
11b0: 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20  RESERVED    2   
11c0: 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52  /* same as RESER
11d0: 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  VED_LOCK */.#def
11e0: 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ine PAGER_EXCLUS
11f0: 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d  IVE   4   /* sam
1200: 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e as EXCLUSIVE_L
1210: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1220: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
1230: 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65   5../*.** If the
1240: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1250: 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f  ERVED_LOCK macro
1260: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1270: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
1280: 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20  .** then failed 
1290: 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20  attempts to get 
12a0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
12b0: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
12c0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  busy callback..*
12d0: 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79  * This is off by
12e0: 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65   default.  To se
12f0: 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20  e why, consider 
1300: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
1310: 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53  enario:.** .** S
1320: 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20  uppose thread A 
1330: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68  already has a sh
1340: 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  ared lock and wa
1350: 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  nts a reserved l
1360: 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42  ock..** Thread B
1370: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1380: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64  eserved lock and
1390: 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73   wants an exclus
13a0: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a  ive lock.  If.**
13b0: 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72   both threads ar
13c0: 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75  e using their bu
13d0: 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74  sy callbacks, it
13e0: 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67   might be a long
13f0: 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20   time.** be for 
1400: 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  one of the threa
1410: 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61  ds give up and a
1420: 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20  llows the other 
1430: 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42  to proceed..** B
1440: 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ut if the thread
1450: 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74   trying to get t
1460: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
1470: 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c   gives up quickl
1480: 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65  y.** (if it neve
1490: 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75  r invokes its bu
14a0: 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65  sy callback) the
14b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e  n the contention
14c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f   will be.** reso
14d0: 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f  lved quickly..*/
14e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14f0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1500: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
1510: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1520: 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a  _LOCK 0.#endif..
1530: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
1540: 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75   rounds values u
1550: 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  p so that if the
1560: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64   value is an add
1570: 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75  ress it.** is gu
1580: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1590: 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69  n address that i
15a0: 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20  s aligned to an 
15b0: 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  8-byte boundary.
15c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43  .*/.#define FORC
15d0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20  E_ALIGNMENT(X)  
15e0: 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 74   (((X)+7)&~7)..t
15f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
1600: 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a 0a 2a  Hdr PgHdr;../*.*
1610: 2a 20 45 61 63 68 20 70 61 67 65 72 20 73 74 6f  * Each pager sto
1620: 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c  res all currentl
1630: 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  y unreferenced p
1640: 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74 20 73  ages in a list s
1650: 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65 61 73  orted.** in leas
1660: 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65 64 20  t-recently-used 
1670: 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69 2e 65  (LRU) order (i.e
1680: 2e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 6d  . the first item
1690: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68 61 73   on the list has
16a0: 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 72 65   .** not been re
16b0: 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20 6c 6f  ferenced in a lo
16c0: 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c 61 73  ng time, the las
16d0: 74 20 69 74 65 6d 20 68 61 73 20 62 65 65 6e 20  t item has been 
16e0: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  recently.** used
16f0: 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ). An instance o
1700: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1710: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61 73 20   is included as 
1720: 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  part of each.** 
1730: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
1740: 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f 73 65  for this purpose
1750: 20 28 76 61 72 69 61 62 6c 65 20 50 61 67 65 72   (variable Pager
1760: 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41 64 64  .lru)..**.** Add
1770: 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 6d 65  itionally, if me
1780: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
1790: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 6c 20  is enabled, all 
17a0: 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  unreferenced pag
17b0: 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  es .** are store
17c0: 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20 4c 52  d in a global LR
17d0: 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c 20 76  U list (global v
17e0: 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65 33 4c  ariable sqlite3L
17f0: 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a 2a 0a  ruPageList)..**.
1800: 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  ** In both cases
1810: 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75 4c 69  , the PagerLruLi
1820: 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  st.pFirstSynced 
1830: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
1840: 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  to.** the first 
1850: 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f 72 72  page in the corr
1860: 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74 20 74  esponding list t
1870: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
1880: 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79 6e 63  uire an.** fsync
1890: 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 66  () operation bef
18a0: 6f 72 65 20 69 74 73 20 6d 65 6d 6f 72 79 20 63  ore its memory c
18b0: 61 6e 20 62 65 20 72 65 63 6c 61 69 6d 65 64 2e  an be reclaimed.
18c0: 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 70   If no such.** p
18d0: 61 67 65 20 65 78 69 73 74 73 2c 20 50 61 67 65  age exists, Page
18e0: 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73 74 53  rLruList.pFirstS
18f0: 79 6e 63 65 64 20 69 73 20 73 65 74 20 74 6f 20  ynced is set to 
1900: 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  NULL..*/.typedef
1910: 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75   struct PagerLru
1920: 4c 69 73 74 20 50 61 67 65 72 4c 72 75 4c 69 73  List PagerLruLis
1930: 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c  t;.struct PagerL
1940: 72 75 4c 69 73 74 20 7b 0a 20 20 50 67 48 64 72  ruList {.  PgHdr
1950: 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1960: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1970: 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a 2f 0a 20  in LRU list */. 
1980: 20 50 67 48 64 72 20 2a 70 4c 61 73 74 3b 20 20   PgHdr *pLast;  
1990: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
19a0: 70 61 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74  page in LRU list
19b0: 20 28 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e   (the most recen
19c0: 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a 20 20 50  tly used) */.  P
19d0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
19e0: 65 64 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ed;   /* First p
19f0: 61 67 65 20 69 6e 20 6c 69 73 74 20 77 69 74 68  age in list with
1a00: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
1a10: 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  =0 */.};../*.** 
1a20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
1a30: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
1a40: 20 74 68 65 20 6e 65 78 74 20 61 6e 64 20 70 72   the next and pr
1a50: 65 76 69 6f 75 73 20 70 6f 69 6e 74 65 72 73 20  evious pointers 
1a60: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69 6e 6b 20  used.** to link 
1a70: 61 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  a PgHdr structur
1a80: 65 20 69 6e 74 6f 20 61 20 50 61 67 65 72 4c 72  e into a PagerLr
1a90: 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20 6c 69 73  uList linked lis
1aa0: 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  t. .*/.typedef s
1ab0: 74 72 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69  truct PagerLruLi
1ac0: 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 3b  nk PagerLruLink;
1ad0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75  .struct PagerLru
1ae0: 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64 72 20 2a  Link {.  PgHdr *
1af0: 70 4e 65 78 74 3b 0a 20 20 50 67 48 64 72 20 2a  pNext;.  PgHdr *
1b00: 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  pPrev;.};../*.**
1b10: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
1b20: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
1b30: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
1b40: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
1b50: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1b60: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1b70: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1b80: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1b90: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1ba0: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
1bb0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
1bc0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
1bd0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1be0: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1bf0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
1c00: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70  erWrite() on a p
1c10: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
1c20: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1c30: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1c40: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1c50: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61  t time sqlite3Pa
1c60: 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73  gerWrite().** is
1c70: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69   called, the ori
1c80: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
1c90: 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  nts are written 
1ca0: 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
1cb0: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  k.** journal and
1cc0: 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c   PgHdr.inJournal
1cd0: 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53   and PgHdr.needS
1ce0: 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61  ync are set.  La
1cf0: 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ter, once.** the
1d00: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61   journal page ha
1d10: 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74  s made it onto t
1d20: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c  he disk surface,
1d30: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
1d40: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20  ** is cleared.  
1d50: 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67  The modified pag
1d60: 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74  e cannot be writ
1d70: 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
1d80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1d90: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
1da0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  l the journal pa
1db0: 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ges has been syn
1dc0: 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  ced to disk and 
1dd0: 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65  the.** PgHdr.nee
1de0: 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63  dSync has been c
1df0: 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leared..**.** Th
1e00: 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c  e PgHdr.dirty fl
1e10: 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73  ag is set when s
1e20: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e30: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
1e40: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
1e50: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
1e60: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
1e70: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1e80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1e90: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1ea0: 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66 20 69 6d  ** Details of im
1eb0: 70 6f 72 74 61 6e 74 20 73 74 72 75 63 74 75 72  portant structur
1ec0: 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  e elements:.**.*
1ed0: 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a  * needSync.**.**
1ee0: 20 20 20 20 20 49 66 20 74 68 69 73 20 69 73 20       If this is 
1ef0: 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  true, this means
1f00: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1f10: 73 61 66 65 20 74 6f 20 77 72 69 74 65 20 74 68  safe to write th
1f20: 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 6f  e page.**     co
1f30: 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74  ntent to the dat
1f40: 61 62 61 73 65 20 62 65 63 61 75 73 65 20 74 68  abase because th
1f50: 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  e original conte
1f60: 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20 20  nt needed.**    
1f70: 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68 61   for rollback ha
1f80: 73 20 6e 6f 74 20 62 79 20 73 79 6e 63 65 64 20  s not by synced 
1f90: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
1fa0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1fb0: 20 20 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61       The origina
1fc0: 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68 61  l content may ha
1fd0: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1fe0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  to the rollback 
1ff0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 62  journal.**     b
2000: 75 74 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65  ut it has not ye
2010: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  t been synced.  
2020: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 77 72 69  So we cannot wri
2030: 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
2040: 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 62  se.**     file b
2050: 65 63 61 75 73 65 20 70 6f 77 65 72 20 66 61 69  ecause power fai
2060: 6c 75 72 65 20 6d 69 67 68 74 20 63 61 75 73 65  lure might cause
2070: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 65   the page in the
2080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2090: 20 20 20 20 20 74 6f 20 6e 65 76 65 72 20 72 65       to never re
20a0: 61 63 68 20 74 68 65 20 64 69 73 6b 2e 20 20 49  ach the disk.  I
20b0: 74 20 69 73 20 61 73 20 69 66 20 74 68 65 20 77  t is as if the w
20c0: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
20d0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
20e0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
20f0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
2100: 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
2110: 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20  .**     .**     
2120: 54 68 69 73 20 66 6c 61 67 20 69 73 20 66 61 6c  This flag is fal
2130: 73 65 20 69 66 20 74 68 65 20 70 61 67 65 20 63  se if the page c
2140: 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c 79 20 6d  ontent exactly m
2150: 61 74 63 68 65 73 20 77 68 61 74 0a 2a 2a 20 20  atches what.**  
2160: 20 20 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69     currently exi
2170: 73 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  sts in the datab
2180: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 6e  ase file.  The n
2190: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
21a0: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c 73  also.**     fals
21b0: 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e if the origina
21c0: 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
21d0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
21e0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
21f0: 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 61  **     journal a
2200: 6e 64 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  nd synced.  If t
2210: 68 65 20 70 61 67 65 20 72 65 70 72 65 73 65 6e  he page represen
2220: 74 73 20 61 20 6e 65 77 20 70 61 67 65 20 74 68  ts a new page th
2230: 61 74 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65  at has.**     be
2240: 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  en added onto th
2250: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2260: 61 62 61 73 65 20 64 75 72 69 6e 67 20 74 68 65  abase during the
2270: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20   current.**     
2280: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2290: 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69   needSync flag i
22a0: 73 20 74 72 75 65 20 75 6e 74 69 6c 20 74 68 65  s true until the
22b0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22c0: 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20 69  se.**     size i
22d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
22e0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 73 79  ader has been sy
22f0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
2300: 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a  .** inJournal.**
2310: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 69 73 20  .**     This is 
2320: 74 72 75 65 20 69 66 20 74 68 65 20 6f 72 69 67  true if the orig
2330: 69 6e 61 6c 20 70 61 67 65 20 68 61 73 20 62 65  inal page has be
2340: 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  en written into 
2350: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20 20  the main.**     
2360: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2370: 2e 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  .  This is alway
2380: 73 20 66 61 6c 73 65 20 66 6f 72 20 6e 65 77 20  s false for new 
2390: 70 61 67 65 73 20 61 64 64 65 64 20 74 6f 0a 2a  pages added to.*
23a0: 2a 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66  *     the end of
23b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23c0: 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  le during the cu
23d0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23e0: 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74 68  n..**     And th
23f0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 6e 6f 74  is flag says not
2400: 68 69 6e 67 20 61 62 6f 75 74 20 77 68 65 74 68  hing about wheth
2410: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
2420: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61 73  urnal.**     has
2430: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2440: 64 69 73 6b 2e 20 20 46 6f 72 20 70 61 67 65 73  disk.  For pages
2450: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2460: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2470: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2480: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
2490: 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20  pression should 
24a0: 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 3a 0a  always be true:.
24b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a 6f  **.**       inJo
24c0: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
24d0: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
24e0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
24f0: 6e 6f 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  no).**.**     Th
2500: 65 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  e pPager->pInJou
2510: 72 6e 61 6c 20 6f 62 6a 65 63 74 20 69 73 20 6f  rnal object is o
2520: 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68  nly valid for th
2530: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
2540: 20 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64    pages of the d
2550: 61 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77  atabase, not new
2560: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
2570: 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64  added to the end
2580: 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64  .**     of the d
2590: 61 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69  atabase, so obvi
25a0: 6f 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20  ously the above 
25b0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f  expression canno
25c0: 74 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69  t be.**     vali
25d0: 64 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e  d for new pages.
25e0: 20 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20    For new pages 
25f0: 69 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  inJournal is alw
2600: 61 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72  ays 0..**.** dir
2610: 74 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  ty.**.**     Whe
2620: 6e 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61  n true, this mea
2630: 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  ns that the cont
2640: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2650: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20  has been.**     
2660: 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65  modified and nee
2670: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
2680: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
2690: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
26a0: 20 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20     If false, it 
26b0: 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
26c0: 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  r the content of
26d0: 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20   the page is.** 
26e0: 20 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72      unchanged or
26f0: 20 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e   else the conten
2700: 74 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74  t is unimportant
2710: 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a   and we do not.*
2720: 2a 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68  *     care wheth
2730: 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20  er or not it is 
2740: 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
2750: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
2760: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d  **.**     This m
2770: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71  eans that the sq
2780: 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
2790: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f  llback() API sho
27a0: 75 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67  uld be.**     ig
27b0: 6e 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70  nored for this p
27c0: 61 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f  age.  The DontRo
27d0: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74  llback() API att
27e0: 65 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20  empts to say.** 
27f0: 20 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e      that the con
2800: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
2810: 20 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d   on disk is unim
2820: 70 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61  portant (it is a
2830: 6e 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20  n.**     unused 
2840: 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
2850: 6c 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74  list) so that it
2860: 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20   is unnecessary 
2870: 74 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62  to .**     rollb
2880: 61 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ack changes to t
2890: 68 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65  his page because
28a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
28b0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  the page.**     
28c0: 63 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f  can change witho
28d0: 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
28e0: 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  meaning of the d
28f0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a  atabase.  This.*
2900: 2a 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72  *     flag overr
2910: 69 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c  ides any DontRol
2920: 6c 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e  lback() attempt.
2930: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
2940: 65 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61  et.**     when a
2950: 20 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69   page that origi
2960: 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  nally contained 
2970: 76 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64  valid data is ad
2980: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
2990: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74  e freelist.  Lat
29a0: 65 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74  er in the same t
29b0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73  ransaction, this
29c0: 20 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20   page might.**  
29d0: 20 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f     be pulled fro
29e0: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  m the freelist a
29f0: 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
2a00: 6d 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  mething differen
2a10: 74 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20  t.**     and at 
2a20: 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44  that point the D
2a30: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50  ontRollback() AP
2a40: 49 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  I will be called
2a50: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20   because.**     
2a60: 70 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d  pages taken from
2a70: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f   the freelist do
2a80: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a90: 70 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20  protected by.** 
2aa0: 20 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b      the rollback
2ab0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74   journal.  But t
2ac0: 68 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68  his flag says th
2ad0: 61 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  at the page was.
2ae0: 2a 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69  **     not origi
2af0: 6e 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68  nally part of th
2b00: 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68  e freelist so th
2b10: 61 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64  at it still need
2b20: 73 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72  s to.**     be r
2b30: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
2b40: 69 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65  ite of any subse
2b50: 71 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61  quent DontRollba
2b60: 63 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  ck() calls..**.*
2b70: 2a 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a  * needRead .**.*
2b80: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
2b90: 6d 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65  means (when true
2ba0: 29 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  ) that the conte
2bb0: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2bc0: 61 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65  as.**     not ye
2bd0: 74 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72  t been loaded fr
2be0: 6f 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e  om disk.  The in
2bf0: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20  -memory content 
2c00: 69 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67  is just.**     g
2c10: 61 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c  arbage.  (Actual
2c20: 6c 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20  ly, we zero the 
2c30: 63 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75  content, but you
2c40: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20   should not.**  
2c50: 20 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75     make any assu
2c60: 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68  mptions about th
2c70: 65 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74  e content nevert
2c80: 68 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65  heless.)  If the
2c90: 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  .**     content 
2ca0: 69 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65  is needed in the
2cb0: 20 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75   future, it shou
2cc0: 6c 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ld be read from 
2cd0: 74 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69  the.**     origi
2ce0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
2cf0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48  e..*/.struct PgH
2d00: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
2d10: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
2d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2d30: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
2d40: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
2d50: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
2d80: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
2d90: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
2da0: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
2db0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
2dc0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
2dd0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
2de0: 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  .  PagerLruLink 
2df0: 66 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  free;           
2e00: 20 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72    /* Next and pr
2e10: 65 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65  evious free page
2e20: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
2e30: 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  extAll;         
2e40: 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20        /* A list 
2e50: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
2e60: 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20    u8 inJournal; 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20   /* TRUE if has 
2e90: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2ea0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2eb0: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ed0: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
2ee0: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
2ef0: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65  nges */.  u8 nee
2f00: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
2f20: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
2f30: 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67  writing this pag
2f40: 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  e */.  u8 always
2f50: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
2f60: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
2f70: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2f80: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
2f90: 0a 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20  .  u8 needRead; 
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e    /* Read conten
2fc0: 74 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28  t if PagerWrite(
2fd0: 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  ) is called */. 
2fe0: 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b   short int nRef;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65  /* Number of use
3010: 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  rs of this page 
3020: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
3030: 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b  ty, *pPrevDirty;
3040: 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67      /* Dirty pag
3050: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
3060: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3070: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
3080: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65  agerLruLink gfre
3090: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
30a0: 20 47 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20   Global list of 
30b0: 6e 52 65 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f  nRef==0 pages */
30c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
30d0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
30e0: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
30f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  ;.#endif.  void 
3100: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3120: 65 20 64 61 74 61 20 2a 2f 0a 20 20 2f 2a 20 50  e data */.  /* P
3130: 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
3140: 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20  s of local data 
3150: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 69 73  appended to this
3160: 20 68 65 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f   header */.};../
3170: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
3180: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
3190: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
31a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
31b0: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
31c0: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
31d0: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
31e0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
31f0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
3200: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
3210: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
3220: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
3230: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
3240: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
3250: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
3260: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
3270: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
3280: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
3290: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
32a0: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
32b0: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
32c0: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
32d0: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
32e0: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
32f0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
3300: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
3310: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
3320: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
3330: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
3340: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
3350: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
3360: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
3370: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
3380: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
3390: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
33a0: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
33b0: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
33c0: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
33d0: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
33e0: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
33f0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
3400: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
3410: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
3420: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
3430: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
3440: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
3450: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
3460: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
3470: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67  tatement */.  Pg
3480: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
3490: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
34a0: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
34b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
34c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
34d0: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
34f0: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
3500: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3510: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  l */.};../*.** A
3520: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
3530: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
3540: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
3550: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
3560: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
3570: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3580: 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43  D,N,X) if( P->xC
3590: 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43  odec!=0 ){ P->xC
35a0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
35b0: 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65  g,D,N,X); }.# de
35c0: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
35d0: 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d  N,X) ((char*)(P-
35e0: 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43  >xCodec!=0?P->xC
35f0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
3600: 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c  g,D,N,X):D)).#el
3610: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
3620: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e  C1(P,D,N,X) /* N
3630: 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65  O-OP */.# define
3640: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
3650: 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64   ((char*)D).#end
3660: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
3670: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  t a pointer to a
3680: 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f   PgHdr into a po
3690: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74  inter to its dat
36a0: 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67  a.** and back ag
36b0: 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ain..*/.#define 
36c0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29  PGHDR_TO_DATA(P)
36d0: 20 20 20 20 28 28 50 29 2d 3e 70 44 61 74 61 29      ((P)->pData)
36e0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
36f0: 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76  O_EXTRA(G,P) ((v
3700: 6f 69 64 2a 29 26 28 28 47 29 5b 31 5d 29 29 0a  oid*)&((G)[1])).
3710: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
3720: 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a  _HIST(P,PGR)  \.
3730: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67              ((Pg
3740: 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72  History*)&((char
3750: 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47  *)(&(P)[1]))[(PG
3760: 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a  R)->nExtra])../*
3770: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
3780: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
3790: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
37a0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
37b0: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72  .**.** Pager.err
37c0: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
37d0: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
37e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
37f0: 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45   or.** or SQLITE
3800: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
3810: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
3820: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
3830: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
3840: 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64   and is returned
3850: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   as the result o
3860: 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61  f every major pa
3870: 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54  ger API call.  T
3880: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  he.** SQLITE_FUL
3890: 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  L return code is
38a0: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
38b0: 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73  ent. It persists
38c0: 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a   only until the.
38d0: 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66  ** next successf
38e0: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
38f0: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
3900: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
3910: 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  o,.** SQLITE_FUL
3920: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
3930: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
3940: 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  erGet() and sqli
3950: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
3960: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
3970: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
3980: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
3990: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
39a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
39b0: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
39c0: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
39d0: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
39e0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e    u8 journalOpen
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3a00: 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
3a10: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3a20: 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  s is valid */.  
3a30: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
3a40: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
3a50: 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66  rue if header of
3a60: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
3a70: 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  ed */.  u8 useJo
3a80: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
3a90: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
3aa0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
3ab0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
3ac0: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3ae0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
3af0: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
3b00: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
3b10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3b20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
3b30: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3b40: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
3b50: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
3b80: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
3b90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
3ba0: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
3bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3bc0: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
3bd0: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
3be0: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
3bf0: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c10: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
3c20: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
3c30: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
3c40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3c50: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
3c60: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
3c70: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
3c80: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
3c90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
3ca0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
3cb0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
3cc0: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74  _FULL */.  u8 st
3cd0: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
3ce0: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
3cf0: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
3d00: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
3d10: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
3d20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3d30: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
3d40: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
3d50: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
3d60: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
3d70: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
3d80: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
3d90: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
3da0: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
3db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3dc0: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
3dd0: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
3de0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
3df0: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
3e00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3e10: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
3e20: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
3e30: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
3e40: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
3e50: 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62  isable DontRollb
3e60: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
3e70: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
3e80: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3e90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
3ea0: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
3eb0: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74   I/O */.  u8 set
3ec0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
3ed0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ee0: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
3ef0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
3f00: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
3f10: 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  otSync;         
3f20: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f30: 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f  . While true, do
3f40: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
3f50: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63  ache */.  u8 exc
3f60: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
3f70: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f80: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
3f90: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
3fa0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
3fb0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
3fc0: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
3fd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
3fe0: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
3ff0: 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b 20 20  u8 dbModified;  
4000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4010: 72 75 65 20 69 66 20 74 68 65 72 65 20 61 72 65  rue if there are
4020: 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 20   any changes to 
4030: 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38 20 63  the Db */.  u8 c
4040: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
4050: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
4060: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
4070: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
4080: 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 76 66  nter */.  u32 vf
4090: 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
40a0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66        /* Flags f
40b0: 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  or sqlite3_vfs.x
40c0: 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  Open() */.  int 
40d0: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
40e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
40f0: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
4100: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
4110: 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  nt dbSize;      
4120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4130: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
4140: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
4150: 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20  nt origDbSize;  
4160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
4170: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
4180: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a  current change *
4190: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65  /.  int stmtSize
41a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
41b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
41c0: 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61  ase (in pages) a
41d0: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
41e0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
4210: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
4220: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
4230: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
4240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
4250: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
4260: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
4270: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
4280: 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20  t stmtNRec;     
4290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
42a0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
42b0: 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61  n stmt subjourna
42c0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  l */.  int nExtr
42d0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
42e0: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
42f0: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63  any bytes to eac
4300: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
4310: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
4320: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
4330: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
4340: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
4350: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
4380: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
4390: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  es */.  int nRef
43a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
43c0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
43d0: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66   with PgHdr.nRef
43e0: 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  >0 */.  int mxPa
43f0: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
4400: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
4410: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
4420: 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20  o hold in cache 
4430: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
4440: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4450: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
4460: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
4470: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 42 69  database */.  Bi
4480: 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c  tvec *pInJournal
4490: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ;         /* One
44a0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
44b0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
44c0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 42 69 74  se file */.  Bit
44d0: 76 65 63 20 2a 70 49 6e 53 74 6d 74 3b 20 20 20  vec *pInStmt;   
44e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
44f0: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
4500: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
4510: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
4520: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
4530: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4540: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
4550: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
4560: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
4570: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4580: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4590: 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f    char *zDirecto
45a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ry;           /*
45b0: 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20   Directory hold 
45c0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
45d0: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
45e0: 63 68 61 72 20 2a 7a 53 74 6d 74 4a 72 6e 6c 3b  char *zStmtJrnl;
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4600: 61 6d 65 20 6f 66 20 74 68 65 20 73 74 61 74 65  ame of the state
4610: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ment journal fil
4620: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
4630: 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20  ile *fd, *jfd;  
4640: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
4650: 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62  iptors for datab
4660: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
4670: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
4680: 65 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20  e *stfd;        
4690: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
46a0: 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74  tor for the stat
46b0: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
46c0: 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72  */.  BusyHandler
46d0: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20   *pBusyHandler; 
46e0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
46f0: 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65  qlite.busyHandle
4700: 72 20 2a 2f 0a 20 20 50 61 67 65 72 4c 72 75 4c  r */.  PagerLruL
4710: 69 73 74 20 6c 72 75 3b 20 20 20 20 20 20 20 20  ist lru;        
4720: 20 20 20 2f 2a 20 4c 52 55 20 6c 69 73 74 20 6f     /* LRU list o
4730: 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a  f free pages */.
4740: 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20    PgHdr *pAll;  
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4760: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   List of all pag
4770: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
4780: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
4790: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70      /* List of p
47a0: 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  ages in the stat
47b0: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
47c0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69   */.  PgHdr *pDi
47d0: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
47e0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
47f0: 20 64 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a   dirty pages */.
4800: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
4810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4820: 20 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66   Current byte of
4830: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
4840: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
4850: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
4860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
4870: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
4880: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
4890: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  der */.  i64 stm
48a0: 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  tHdrOff;        
48b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f       /* First jo
48c0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
48d0: 74 74 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  tten this statem
48e0: 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  ent */.  i64 stm
48f0: 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20  tCksum;         
4900: 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69       /* cksumIni
4910: 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74  t when statement
4920: 20 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a   was started */.
4930: 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b    i64 stmtJSize;
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4950: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
4960: 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29   at stmt_begin()
4970: 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72   */.  int sector
4980: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4990: 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63    /* Assumed sec
49a0: 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20  tor size during 
49b0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64  rollback */.#ifd
49c0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
49d0: 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73   int nHit, nMiss
49e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
49f0: 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d  Cache hits and m
4a00: 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  issing */.  int 
4a10: 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20  nRead, nWrite;  
4a20: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4a30: 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f 77  ase pages read/w
4a40: 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66  ritten */.#endif
4a50: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72  .  void (*xDestr
4a60: 75 63 74 6f 72 29 28 44 62 50 61 67 65 2a 2c 69  uctor)(DbPage*,i
4a70: 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  nt); /* Call thi
4a80: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66  s routine when f
4a90: 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  reeing pages */.
4aa0: 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
4ab0: 65 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  er)(DbPage*,int)
4ac0: 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  ;   /* Call this
4ad0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
4ae0: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
4af0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
4b00: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
4b10: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
4b20: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
4b30: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
4b40: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
4b50: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
4b60: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
4b70: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
4b80: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
4b90: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74   */.#endif.  int
4ba0: 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20 20 20   nHash;         
4bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
4bc0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61   of the pager ha
4bd0: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67  sh table */.  Pg
4be0: 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20  Hdr **aHash;    
4bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
4c00: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
4c10: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67  age number to Pg
4c20: 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  Hdr */.#ifdef SQ
4c30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
4c40: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
4c50: 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20  Pager *pNext;   
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
4c70: 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 6c 69 73  oubly linked lis
4c80: 74 20 6f 66 20 70 61 67 65 72 73 20 6f 6e 20 77  t of pagers on w
4c90: 68 69 63 68 20 2a 2f 0a 20 20 50 61 67 65 72 20  hich */.  Pager 
4ca0: 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  *pPrev;         
4cb0: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
4cc0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
4cd0: 29 20 77 69 6c 6c 20 77 6f 72 6b 20 2a 2f 0a 20  ) will work */. 
4ce0: 20 69 6e 74 20 69 49 6e 55 73 65 4d 4d 3b 20 20   int iInUseMM;  
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d00: 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 75 6e 61 76  Non-zero if unav
4d10: 61 69 6c 61 62 6c 65 20 74 6f 20 4d 4d 20 2a 2f  ailable to MM */
4d20: 0a 20 20 69 6e 74 20 69 49 6e 55 73 65 44 42 3b  .  int iInUseDB;
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4d40: 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 69 6e  * Non-zero if in
4d50: 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
4d60: 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f 0a 23 65 6e  _memory() */.#en
4d70: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
4d80: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
4d90: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
4da0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
4db0: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
4dc0: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
4dd0: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
4de0: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
4df0: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
4e00: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 7d 3b 0a  e changes */.};.
4e10: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
4e20: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
4e30: 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74  ables hold count
4e40: 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  ers used for.** 
4e50: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
4e60: 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61   only.  These va
4e70: 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65  riables do not e
4e80: 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e  xist in.** a non
4e90: 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20  -testing build. 
4ea0: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
4eb0: 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d   are not thread-
4ec0: 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  safe..*/.#ifdef 
4ed0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
4ee0: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
4ef0: 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  addb_count = 0; 
4f00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4f10: 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20  full pages read 
4f20: 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73  from DB */.int s
4f30: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
4f40: 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  tedb_count = 0; 
4f50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
4f60: 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65  ull pages writte
4f70: 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73  n to DB */.int s
4f80: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
4f90: 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  tej_count = 0;  
4fa0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
4fb0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
4fc0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73  journal */.int s
4fd0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
4fe0: 72 65 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ree_count = 0;  
4ff0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
5000: 61 63 68 65 20 70 61 67 65 73 20 66 72 65 65 64  ache pages freed
5010: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47   */.# define PAG
5020: 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a  ER_INCR(v)  v++.
5030: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
5040: 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e  AGER_INCR(v).#en
5050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
5060: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
5070: 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
5080: 68 65 61 64 20 6f 66 20 61 20 64 6f 75 62 6c 65  head of a double
5090: 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 0a 2a 2a 20  -linked list.** 
50a0: 6f 66 20 61 6c 6c 20 70 61 67 65 72 73 20 74 68  of all pagers th
50b0: 61 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20  at are eligible 
50c0: 66 6f 72 20 70 61 67 65 20 73 74 65 61 6c 69 6e  for page stealin
50d0: 67 20 62 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69  g by the.** sqli
50e0: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
50f0: 72 79 28 29 20 69 6e 74 65 72 66 61 63 65 2e 20  ry() interface. 
5100: 20 41 63 63 65 73 73 20 74 6f 20 74 68 69 73 20   Access to this 
5110: 6c 69 73 74 20 69 73 0a 2a 2a 20 70 72 6f 74 65  list is.** prote
5120: 63 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  cted by the SQLI
5130: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
5140: 4d 45 4d 32 20 6d 75 74 65 78 2e 0a 2a 2f 0a 23  MEM2 mutex..*/.#
5150: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5160: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
5170: 45 4d 45 4e 54 0a 73 74 61 74 69 63 20 50 61 67  EMENT.static Pag
5180: 65 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  er *sqlite3Pager
5190: 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61 74 69 63  List = 0;.static
51a0: 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 73 71   PagerLruList sq
51b0: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
51c0: 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 23 65   = {0, 0, 0};.#e
51d0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  ndif.../*.** Jou
51e0: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
51f0: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
5200: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
5210: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
5220: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
5230: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
5240: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
5250: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
5260: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65  ..**.** Since ve
5270: 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65  rsion 2.8.0, the
5280: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
5290: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
52a0: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
52b0: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
52c0: 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65  on.  If the powe
52d0: 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  r fails while th
52e0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67  e journal is beg
52f0: 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73  in.** written, s
5300: 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61  emi-random garba
5310: 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70  ge data might ap
5320: 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  pear in the jour
5330: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65  nal.** file afte
5340: 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  r power is resto
5350: 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65  red.  If an atte
5360: 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65  mpt is then made
5370: 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20  .** to roll the 
5380: 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68  journal back, th
5390: 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
53a0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20   be corrupted.  
53b0: 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  The additional.*
53c0: 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * sanity checkin
53d0: 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74  g data is an att
53e0: 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72  empt to discover
53f0: 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20   the garbage in 
5400: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  the.** journal a
5410: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a  nd ignore it..**
5420: 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63  .** The sanity c
5430: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
5440: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ion for the new 
5450: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
5460: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20  onsists.** of a 
5470: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
5480: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20  on each page of 
5490: 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b  data.  The check
54a0: 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a  sum covers both.
54b0: 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
54c0: 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65  er and the pPage
54d0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
54e0: 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68  s of data for th
54f0: 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
5500: 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c  cksum is initial
5510: 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74  ized to a 32-bit
5520: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68   random value th
5530: 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  at appears in th
5540: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
5550: 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  e right after th
5560: 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72  e header.  The r
5570: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65  andom initialize
5580: 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a  r is important,.
5590: 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61  ** because garba
55a0: 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70  ge data that app
55b0: 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  ears at the end 
55c0: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  of a journal is 
55d0: 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74  likely.** data t
55e0: 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20  hat was once in 
55f0: 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74  other files that
5600: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64   have now been d
5610: 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a  eleted.  If the.
5620: 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20  ** garbage data 
5630: 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73  came from an obs
5640: 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
5650: 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  le, the checksum
5660: 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f  s might.** be co
5670: 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69  rrect.  But by i
5680: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
5690: 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64  checksum to rand
56a0: 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a  om value which.*
56b0: 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  * is different f
56c0: 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c  or every journal
56d0: 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  , we minimize th
56e0: 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  at risk..*/.stat
56f0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
5700: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
5710: 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  agic[] = {.  0xd
5720: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
5730: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
5740: 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a   0x63, 0xd7,.};.
5750: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
5760: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  of the header an
5770: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69  d of each page i
5780: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
5790: 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62   determined.** b
57a0: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
57b0: 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69  macros..*/.#defi
57c0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
57d0: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
57e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
57f0: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
5800: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
5810: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
5820: 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c  . In the future,
5830: 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   this could be.*
5840: 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61  * set to some va
5850: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
5860: 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65  e disk controlle
5870: 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74  r. The important
5880: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74  .** characterist
5890: 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73  ic is that it is
58a0: 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61   the same size a
58b0: 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  s a disk sector.
58c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
58d0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
58e0: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
58f0: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
5900: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
5910: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
5920: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
5930: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5940: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
5950: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
5960: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
5970: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
5980: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
5990: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
59a0: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
59b0: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
59c0: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
59d0: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
59e0: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
59f0: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
5a00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
5a10: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
5a20: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
5a30: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
5a40: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
5a50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
5a60: 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52  age number PAGER
5a70: 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65  _MJ_PGNO is neve
5a80: 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c  r used in an SQL
5a90: 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74  ite database (it
5aa0: 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20   is.** reserved 
5ab0: 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75  for working arou
5ac0: 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73  nd a windows/pos
5ad0: 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69  ix incompatibili
5ae0: 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73  ty). It is.** us
5af0: 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed in the journa
5b00: 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61  l to signify tha
5b10: 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  t the remainder 
5b20: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
5b30: 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74  ile .** is devot
5b40: 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20  ed to storing a 
5b50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5b60: 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20  ame - there are 
5b70: 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f  no more pages to
5b80: 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53  .** roll back. S
5b90: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20  ee comments for 
5ba0: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61  function writeMa
5bb0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
5bc0: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a  r details..*/./*
5bd0: 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d   #define PAGER_M
5be0: 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49  J_PGNO(x) (PENDI
5bf0: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
5c00: 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66  geSize)) */.#def
5c10: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
5c20: 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42  O(x) ((PENDING_B
5c30: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
5c40: 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54  ze))+1)../*.** T
5c50: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
5c60: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
5c70: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
5c80: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
5c90: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
5ca0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
5cb0: 72 45 6e 74 65 72 28 29 20 61 6e 64 20 70 61 67  rEnter() and pag
5cc0: 65 72 4c 65 61 76 65 28 29 20 72 6f 75 74 69 6e  erLeave() routin
5cd0: 65 73 20 61 63 71 75 69 72 65 20 61 6e 64 20 72  es acquire and r
5ce0: 65 6c 65 61 73 65 0a 2a 2a 20 61 20 6d 75 74 65  elease.** a mute
5cf0: 78 20 6f 6e 20 65 61 63 68 20 70 61 67 65 72 2e  x on each pager.
5d00: 20 20 54 68 65 20 6d 75 74 65 78 20 69 73 20 72    The mutex is r
5d10: 65 63 75 72 73 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  ecursive..**.** 
5d20: 54 68 69 73 20 69 73 20 61 20 73 70 65 63 69 61  This is a specia
5d30: 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74 65 78 2e  l-purpose mutex.
5d40: 20 20 49 74 20 6f 6e 6c 79 20 70 72 6f 76 69 64    It only provid
5d50: 65 73 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73  es mutual exclus
5d60: 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  ion.** between t
5d70: 68 65 20 42 74 72 65 65 20 61 6e 64 20 74 68 65  he Btree and the
5d80: 20 4d 65 6d 6f 72 79 20 4d 61 6e 61 67 65 6d 65   Memory Manageme
5d90: 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  nt sqlite3_relea
5da0: 73 65 5f 6d 65 6d 6f 72 79 28 29 0a 2a 2a 20 66  se_memory().** f
5db0: 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 64 6f 65  unction.  It doe
5dc0: 73 20 6e 6f 74 20 70 72 65 76 65 6e 74 2c 20 66  s not prevent, f
5dd0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 77 6f 20  or example, two 
5de0: 42 74 72 65 65 73 20 66 72 6f 6d 20 61 63 63 65  Btrees from acce
5df0: 73 73 69 6e 67 0a 2a 2a 20 74 68 65 20 73 61 6d  ssing.** the sam
5e00: 65 20 70 61 67 65 72 20 61 74 20 74 68 65 20 73  e pager at the s
5e10: 61 6d 65 20 74 69 6d 65 2e 20 20 4f 74 68 65 72  ame time.  Other
5e20: 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
5e30: 20 6d 75 74 65 78 65 73 20 69 6e 0a 2a 2a 20 74   mutexes in.** t
5e40: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 68  he btree layer h
5e50: 61 6e 64 6c 65 20 74 68 61 74 20 63 68 6f 72 65  andle that chore
5e60: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
5e70: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
5e80: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 73 74  _MANAGEMENT.  st
5e90: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 45  atic void pagerE
5ea0: 6e 74 65 72 28 50 61 67 65 72 20 2a 70 29 7b 0a  nter(Pager *p){.
5eb0: 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 2b      p->iInUseDB+
5ec0: 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 49  +;.    if( p->iI
5ed0: 6e 55 73 65 4d 4d 20 26 26 20 70 2d 3e 69 49 6e  nUseMM && p->iIn
5ee0: 55 73 65 44 42 3d 3d 31 20 29 7b 0a 23 69 66 6e  UseDB==1 ){.#ifn
5ef0: 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  def SQLITE_MUTEX
5f00: 5f 4e 4f 4f 50 0a 20 20 20 20 20 20 73 71 6c 69  _NOOP.      sqli
5f10: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
5f20: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 20 3d 20  ;.      mutex = 
5f30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
5f40: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
5f50: 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23  _STATIC_MEM2);.#
5f60: 65 6e 64 69 66 0a 20 20 20 20 20 20 70 2d 3e 69  endif.      p->i
5f70: 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 20  InUseDB = 0;.   
5f80: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
5f90: 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20  _enter(mutex);. 
5fa0: 20 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42       p->iInUseDB
5fb0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
5fc0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
5fd0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  mutex);.    }.  
5fe0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e    assert( p->iIn
5ff0: 55 73 65 4d 4d 3d 3d 30 20 29 3b 0a 20 20 7d 0a  UseMM==0 );.  }.
6000: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
6010: 67 65 72 4c 65 61 76 65 28 50 61 67 65 72 20 2a  gerLeave(Pager *
6020: 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73  p){.    p->iInUs
6030: 65 44 42 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  eDB--;.    asser
6040: 74 28 20 70 2d 3e 69 49 6e 55 73 65 44 42 3e 3d  t( p->iInUseDB>=
6050: 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 23  0 );.  }.#else.#
6060: 20 64 65 66 69 6e 65 20 70 61 67 65 72 45 6e 74   define pagerEnt
6070: 65 72 28 58 29 0a 23 20 64 65 66 69 6e 65 20 70  er(X).# define p
6080: 61 67 65 72 4c 65 61 76 65 28 58 29 0a 23 65 6e  agerLeave(X).#en
6090: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70  dif../*.** Add p
60a0: 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 65  age pPg to the e
60b0: 6e 64 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64  nd of the linked
60c0: 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79   list managed by
60d0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 4c   structure.** pL
60e0: 69 73 74 20 28 70 50 67 20 62 65 63 6f 6d 65 73  ist (pPg becomes
60f0: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
6100: 69 6e 20 74 68 65 20 6c 69 73 74 20 2d 20 74 68  in the list - th
6110: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
6120: 0a 2a 2a 20 75 73 65 64 29 2e 20 41 72 67 75 6d  .** used). Argum
6130: 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64  ent pLink should
6140: 20 70 6f 69 6e 74 20 74 6f 20 65 69 74 68 65 72   point to either
6150: 20 70 50 67 2d 3e 66 72 65 65 20 6f 72 20 70 50   pPg->free or pP
6160: 67 2d 3e 67 66 72 65 65 2c 0a 2a 2a 20 64 65 70  g->gfree,.** dep
6170: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
6180: 72 20 70 50 67 20 69 73 20 62 65 69 6e 67 20 61  r pPg is being a
6190: 64 64 65 64 20 74 6f 20 74 68 65 20 70 61 67 65  dded to the page
61a0: 72 2d 73 70 65 63 69 66 69 63 20 6f 72 0a 2a 2a  r-specific or.**
61b0: 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74   global LRU list
61c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
61d0: 20 6c 69 73 74 41 64 64 28 50 61 67 65 72 4c 72   listAdd(PagerLr
61e0: 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 50 61  uList *pList, Pa
61f0: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e  gerLruLink *pLin
6200: 6b 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  k, PgHdr *pPg){.
6210: 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d    pLink->pNext =
6220: 20 30 3b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 50 72   0;.  pLink->pPr
6230: 65 76 20 3d 20 70 4c 69 73 74 2d 3e 70 4c 61 73  ev = pList->pLas
6240: 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
6250: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
6260: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73 73  MANAGEMENT.  ass
6270: 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d  ert(pLink==&pPg-
6280: 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d  >free || pLink==
6290: 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20  &pPg->gfree);.  
62a0: 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70  assert(pLink==&p
62b0: 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69  Pg->gfree || pLi
62c0: 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72 75 50  st!=&sqlite3LruP
62d0: 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  ageList);.#endif
62e0: 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70  ..  if( pList->p
62f0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Last ){.    int 
6300: 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70  iOff = (char *)p
6310: 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70  Link - (char *)p
6320: 50 67 3b 0a 20 20 20 20 50 61 67 65 72 4c 72 75  Pg;.    PagerLru
6330: 4c 69 6e 6b 20 2a 70 4c 61 73 74 4c 69 6e 6b 20  Link *pLastLink 
6340: 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  = (PagerLruLink 
6350: 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69 73 74  *)(&((u8 *)pList
6360: 2d 3e 70 4c 61 73 74 29 5b 69 4f 66 66 5d 29 3b  ->pLast)[iOff]);
6370: 0a 20 20 20 20 70 4c 61 73 74 4c 69 6e 6b 2d 3e  .    pLastLink->
6380: 70 4e 65 78 74 20 3d 20 70 50 67 3b 0a 20 20 7d  pNext = pPg;.  }
6390: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
63a0: 28 21 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 29  (!pList->pFirst)
63b0: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  ;.    pList->pFi
63c0: 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 0a  rst = pPg;.  }..
63d0: 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d    pList->pLast =
63e0: 20 70 50 67 3b 0a 20 20 69 66 28 20 21 70 4c 69   pPg;.  if( !pLi
63f0: 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  st->pFirstSynced
6400: 20 26 26 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e   && pPg->needSyn
6410: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  c==0 ){.    pLis
6420: 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  t->pFirstSynced 
6430: 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = pPg;.  }.}../*
6440: 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 50 67 20 66  .** Remove pPg f
6450: 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6d 61 6e  rom the list man
6460: 61 67 65 64 20 62 79 20 74 68 65 20 73 74 72 75  aged by the stru
6470: 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
6480: 20 62 79 20 70 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a   by pList..**.**
6490: 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20   Argument pLink 
64a0: 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20  should point to 
64b0: 65 69 74 68 65 72 20 70 50 67 2d 3e 66 72 65 65  either pPg->free
64c0: 20 6f 72 20 70 50 67 2d 3e 67 66 72 65 65 2c 20   or pPg->gfree, 
64d0: 64 65 70 65 6e 64 69 6e 67 20 0a 2a 2a 20 6f 6e  depending .** on
64e0: 20 77 68 65 74 68 65 72 20 70 50 67 20 69 73 20   whether pPg is 
64f0: 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74  being added to t
6500: 68 65 20 70 61 67 65 72 2d 73 70 65 63 69 66 69  he pager-specifi
6510: 63 20 6f 72 20 67 6c 6f 62 61 6c 20 4c 52 55 20  c or global LRU 
6520: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
6530: 76 6f 69 64 20 6c 69 73 74 52 65 6d 6f 76 65 28  void listRemove(
6540: 50 61 67 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c  PagerLruList *pL
6550: 69 73 74 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e  ist, PagerLruLin
6560: 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20  k *pLink, PgHdr 
6570: 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 69 4f 66  *pPg){.  int iOf
6580: 66 20 3d 20 28 63 68 61 72 20 2a 29 70 4c 69 6e  f = (char *)pLin
6590: 6b 20 2d 20 28 63 68 61 72 20 2a 29 70 50 67 3b  k - (char *)pPg;
65a0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
65b0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
65c0: 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73 73 65 72  NAGEMENT.  asser
65d0: 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66  t(pLink==&pPg->f
65e0: 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70  ree || pLink==&p
65f0: 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20 61 73  Pg->gfree);.  as
6600: 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67  sert(pLink==&pPg
6610: 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69 73 74  ->gfree || pList
6620: 21 3d 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67  !=&sqlite3LruPag
6630: 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  eList);.#endif..
6640: 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74    if( pPg==pList
6650: 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ->pFirst ){.    
6660: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 3d 20  pList->pFirst = 
6670: 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLink->pNext;.  
6680: 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69  }.  if( pPg==pLi
6690: 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20  st->pLast ){.   
66a0: 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20   pList->pLast = 
66b0: 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20  pLink->pPrev;.  
66c0: 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70  }.  if( pLink->p
66d0: 50 72 65 76 20 29 7b 0a 20 20 20 20 50 61 67 65  Prev ){.    Page
66e0: 72 4c 72 75 4c 69 6e 6b 20 2a 70 50 72 65 76 4c  rLruLink *pPrevL
66f0: 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c  ink = (PagerLruL
6700: 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70  ink *)(&((u8 *)p
6710: 4c 69 6e 6b 2d 3e 70 50 72 65 76 29 5b 69 4f 66  Link->pPrev)[iOf
6720: 66 5d 29 3b 0a 20 20 20 20 70 50 72 65 76 4c 69  f]);.    pPrevLi
6730: 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e  nk->pNext = pLin
6740: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  k->pNext;.  }.  
6750: 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74  if( pLink->pNext
6760: 20 29 7b 0a 20 20 20 20 50 61 67 65 72 4c 72 75   ){.    PagerLru
6770: 4c 69 6e 6b 20 2a 70 4e 65 78 74 4c 69 6e 6b 20  Link *pNextLink 
6780: 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  = (PagerLruLink 
6790: 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69 6e 6b  *)(&((u8 *)pLink
67a0: 2d 3e 70 4e 65 78 74 29 5b 69 4f 66 66 5d 29 3b  ->pNext)[iOff]);
67b0: 0a 20 20 20 20 70 4e 65 78 74 4c 69 6e 6b 2d 3e  .    pNextLink->
67c0: 70 50 72 65 76 20 3d 20 70 4c 69 6e 6b 2d 3e 70  pPrev = pLink->p
67d0: 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Prev;.  }.  if( 
67e0: 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72  pPg==pList->pFir
67f0: 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
6800: 50 67 48 64 72 20 2a 70 20 3d 20 70 4c 69 6e 6b  PgHdr *p = pLink
6810: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 77 68 69  ->pNext;.    whi
6820: 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  le( p && p->need
6830: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 50 61  Sync ){.      Pa
6840: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 20 3d  gerLruLink *pL =
6850: 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a   (PagerLruLink *
6860: 29 28 26 28 28 75 38 20 2a 29 70 29 5b 69 4f 66  )(&((u8 *)p)[iOf
6870: 66 5d 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70  f]);.      p = p
6880: 4c 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  L->pNext;.    }.
6890: 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73      pList->pFirs
68a0: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d  tSynced = p;.  }
68b0: 0a 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74  ..  pLink->pNext
68c0: 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20   = pLink->pPrev 
68d0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41  = 0;.}../* .** A
68e0: 64 64 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  dd page pPg to t
68f0: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20  he list of free 
6900: 70 61 67 65 73 20 66 6f 72 20 74 68 65 20 70 61  pages for the pa
6910: 67 65 72 2e 20 49 66 20 0a 2a 2a 20 6d 65 6d 6f  ger. If .** memo
6920: 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73  ry-management is
6930: 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f 20 61   enabled, also a
6940: 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  dd the page to t
6950: 68 65 20 67 6c 6f 62 61 6c 20 0a 2a 2a 20 6c 69  he global .** li
6960: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
6970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6980: 20 6c 72 75 4c 69 73 74 41 64 64 28 50 67 48 64   lruListAdd(PgHd
6990: 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73 74 41  r *pPg){.  listA
69a0: 64 64 28 26 70 50 67 2d 3e 70 50 61 67 65 72 2d  dd(&pPg->pPager-
69b0: 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72 65 65  >lru, &pPg->free
69c0: 2c 20 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53  , pPg);.#ifdef S
69d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
69e0: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
69f0: 20 69 66 28 20 21 70 50 67 2d 3e 70 50 61 67 65   if( !pPg->pPage
6a00: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
6a10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6a20: 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ter(sqlite3_mute
6a30: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
6a40: 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29  UTEX_STATIC_LRU)
6a50: 29 3b 0a 20 20 20 20 6c 69 73 74 41 64 64 28 26  );.    listAdd(&
6a60: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
6a70: 73 74 2c 20 26 70 50 67 2d 3e 67 66 72 65 65 2c  st, &pPg->gfree,
6a80: 20 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74   pPg);.    sqlit
6a90: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
6aa0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
6ab0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
6ac0: 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20  STATIC_LRU));.  
6ad0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a  }.#endif.}../* .
6ae0: 2a 2a 20 52 65 6d 6f 76 65 20 70 61 67 65 20 70  ** Remove page p
6af0: 50 67 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  Pg from the list
6b00: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 66   of free pages f
6b10: 6f 72 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  or the associate
6b20: 64 20 70 61 67 65 72 2e 0a 2a 2a 20 49 66 20 6d  d pager..** If m
6b30: 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74  emory-management
6b40: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73   is enabled, als
6b50: 6f 20 72 65 6d 6f 76 65 20 70 50 67 20 66 72 6f  o remove pPg fro
6b60: 6d 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73  m the global lis
6b70: 74 0a 2a 2a 20 6f 66 20 66 72 65 65 20 70 61 67  t.** of free pag
6b80: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
6b90: 69 64 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65  id lruListRemove
6ba0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
6bb0: 6c 69 73 74 52 65 6d 6f 76 65 28 26 70 50 67 2d  listRemove(&pPg-
6bc0: 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20 26 70  >pPager->lru, &p
6bd0: 50 67 2d 3e 66 72 65 65 2c 20 70 50 67 29 3b 0a  Pg->free, pPg);.
6be0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6bf0: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
6c00: 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50  GEMENT.  if( !pP
6c10: 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  g->pPager->memDb
6c20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
6c30: 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
6c40: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
6c50: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6c60: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 6c  TIC_LRU));.    l
6c70: 69 73 74 52 65 6d 6f 76 65 28 26 73 71 6c 69 74  istRemove(&sqlit
6c80: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2c 20 26  e3LruPageList, &
6c90: 70 50 67 2d 3e 67 66 72 65 65 2c 20 70 50 67 29  pPg->gfree, pPg)
6ca0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
6cb0: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
6cc0: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
6cd0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
6ce0: 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e  C_LRU));.  }.#en
6cf0: 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  dif.}../* .** Th
6d00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
6d10: 61 6c 6c 65 64 20 6a 75 73 74 20 61 66 74 65 72  alled just after
6d20: 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c   the needSync fl
6d30: 61 67 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  ag has been clea
6d40: 72 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 6c 6c 20  red.** from all 
6d50: 70 61 67 65 73 20 6d 61 6e 61 67 65 64 20 62 79  pages managed by
6d60: 20 70 50 61 67 65 72 20 28 75 73 75 61 6c 6c 79   pPager (usually
6d70: 20 62 65 63 61 75 73 65 20 74 68 65 20 6a 6f 75   because the jou
6d80: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68 61 73  rnal file.** has
6d90: 20 6a 75 73 74 20 62 65 65 6e 20 73 79 6e 63 65   just been synce
6da0: 64 29 2e 20 49 74 20 75 70 64 61 74 65 73 20 74  d). It updates t
6db0: 68 65 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  he pPager->lru.p
6dc0: 46 69 72 73 74 53 79 6e 63 65 64 20 76 61 72 69  FirstSynced vari
6dd0: 61 62 6c 65 0a 2a 2a 20 61 6e 64 2c 20 69 66 20  able.** and, if 
6de0: 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e  memory-managemen
6df0: 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  t is enabled, th
6e00: 65 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  e sqlite3LruPage
6e10: 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65  List.pFirstSynce
6e20: 64 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 61 6c  d.** variable al
6e30: 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  so..*/.static vo
6e40: 69 64 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72  id lruListSetFir
6e50: 73 74 53 79 6e 63 65 64 28 50 61 67 65 72 20 2a  stSynced(Pager *
6e60: 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65  pPager){.  pPage
6e70: 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e  r->lru.pFirstSyn
6e80: 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72  ced = pPager->lr
6e90: 75 2e 70 46 69 72 73 74 3b 0a 23 69 66 64 65 66  u.pFirst;.#ifdef
6ea0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
6eb0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
6ec0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
6ed0: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 50 67 48  memDb ){.    PgH
6ee0: 64 72 20 2a 70 3b 0a 20 20 20 20 73 71 6c 69 74  dr *p;.    sqlit
6ef0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
6f00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
6f10: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
6f20: 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20  STATIC_LRU));.  
6f30: 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 33 4c    for(p=sqlite3L
6f40: 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
6f50: 74 3b 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  t; p && p->needS
6f60: 79 6e 63 3b 20 70 3d 70 2d 3e 67 66 72 65 65 2e  ync; p=p->gfree.
6f70: 70 4e 65 78 74 29 3b 0a 20 20 20 20 61 73 73 65  pNext);.    asse
6f80: 72 74 28 70 3d 3d 70 50 61 67 65 72 2d 3e 6c 72  rt(p==pPager->lr
6f90: 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 7c  u.pFirstSynced |
6fa0: 7c 20 70 3d 3d 73 71 6c 69 74 65 33 4c 72 75 50  | p==sqlite3LruP
6fb0: 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79  ageList.pFirstSy
6fc0: 6e 63 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  nced);.    sqlit
6fd0: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46  e3LruPageList.pF
6fe0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
6ff0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
7000: 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f  x_leave(sqlite3_
7010: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
7020: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
7030: 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  LRU));.  }.#endi
7040: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
7050: 6e 20 74 72 75 65 20 69 66 20 70 61 67 65 20 2a  n true if page *
7060: 70 50 67 20 68 61 73 20 61 6c 72 65 61 64 79 20  pPg has already 
7070: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7080: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
7090: 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61   journal (or sta
70a0: 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20  tement snapshot 
70b0: 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
70c0: 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70 61 72  , if *pPg is par
70d0: 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65  t.** of an in-me
70e0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a  mory database)..
70f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
7100: 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67  geInStatement(Pg
7110: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
7120: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
7130: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
7140: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 65 74  MEMDB ){.    ret
7150: 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  urn PGHDR_TO_HIS
7160: 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2d 3e  T(pPg, pPager)->
7170: 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b  inStmt;.  }else{
7180: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
7190: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
71a0: 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70  ager->pInStmt, p
71b0: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  Pg->pgno);.  }.}
71c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
71d0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
71e0: 61 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20  ager hash table 
71f0: 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65  to N.  N must be
7200: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74   a power.** of t
7210: 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  wo..*/.static vo
7220: 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f  id pager_resize_
7230: 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72  hash_table(Pager
7240: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29   *pPager, int N)
7250: 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  {.  PgHdr **aHas
7260: 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72  h, *pPg;.  asser
7270: 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d  t( N>0 && (N&(N-
7280: 31 29 29 3d 3d 30 20 29 3b 0a 23 69 66 64 65 66  1))==0 );.#ifdef
7290: 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53   SQLITE_MALLOC_S
72a0: 4f 46 54 5f 4c 49 4d 49 54 0a 20 20 69 66 28 20  OFT_LIMIT.  if( 
72b0: 4e 2a 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30  N*sizeof(aHash[0
72c0: 5d 29 3e 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43  ])>SQLITE_MALLOC
72d0: 5f 53 4f 46 54 5f 4c 49 4d 49 54 20 29 7b 0a 20  _SOFT_LIMIT ){. 
72e0: 20 20 20 4e 20 3d 20 53 51 4c 49 54 45 5f 4d 41     N = SQLITE_MA
72f0: 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 2f  LLOC_SOFT_LIMIT/
7300: 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29  sizeof(aHash[0])
7310: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 3d 3d 70  ;.  }.  if( N==p
7320: 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 20 72  Pager->nHash ) r
7330: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
7340: 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
7350: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
7360: 2d 3e 61 48 61 73 68 21 3d 30 20 29 20 73 71 6c  ->aHash!=0 ) sql
7370: 69 74 65 33 46 61 75 6c 74 42 65 67 69 6e 42 65  ite3FaultBeginBe
7380: 6e 69 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c  nign(SQLITE_FAUL
7390: 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43  TINJECTOR_MALLOC
73a0: 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71 6c  );.  aHash = sql
73b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
73c0: 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29  sizeof(aHash[0])
73d0: 2a 4e 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  *N );.  if( pPag
73e0: 65 72 2d 3e 61 48 61 73 68 21 3d 30 20 29 20 73  er->aHash!=0 ) s
73f0: 71 6c 69 74 65 33 46 61 75 6c 74 45 6e 64 42 65  qlite3FaultEndBe
7400: 6e 69 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c  nign(SQLITE_FAUL
7410: 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43  TINJECTOR_MALLOC
7420: 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
7430: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 61  pPager);.  if( a
7440: 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Hash==0 ){.    /
7450: 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68  * Failure to reh
7460: 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72  ash is not an er
7470: 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ror.  It is only
7480: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68   a performance h
7490: 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  it. */.    retur
74a0: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
74b0: 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  _free(pPager->aH
74c0: 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ash);.  pPager->
74d0: 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61  nHash = N;.  pPa
74e0: 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61  ger->aHash = aHa
74f0: 73 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  sh;.  for(pPg=pP
7500: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
7510: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
7520: 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a  ll){.    int h;.
7530: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
7540: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  o==0 ){.      as
7550: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
7560: 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Hash==0 && pPg->
7570: 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
7580: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
7590: 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50      }.    h = pP
75a0: 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b  g->pgno & (N-1);
75b0: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
75c0: 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a  ash = aHash[h];.
75d0: 20 20 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d      if( aHash[h]
75e0: 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b   ){.      aHash[
75f0: 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  h]->pPrevHash = 
7600: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  pPg;.    }.    a
7610: 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
7620: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
7630: 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  h = 0;.  }.}../*
7640: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
7650: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
7660: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
7670: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
7680: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
7690: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
76a0: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
76b0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
76c0: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
76d0: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
76e0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
76f0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
7700: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
7710: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
7720: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
7730: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
7740: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
7750: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
7760: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
7770: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
7780: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
7790: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
77a0: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
77b0: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
77c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
77d0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
77e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
77f0: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
7800: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7810: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
7820: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
7830: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
7840: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
7850: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
7860: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
7870: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
7880: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
7890: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
78a0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
78b0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
78c0: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
78d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
78e0: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
78f0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
7900: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
7910: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
7920: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
7930: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
7940: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
7950: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
7960: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
7970: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
7980: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
7990: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
79a0: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  set);.}../*.** I
79b0: 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70  f file pFd is op
79c0: 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  en, call sqlite3
79d0: 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74  OsUnlock() on it
79e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
79f0: 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  osUnlock(sqlite3
7a00: 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20  _file *pFd, int 
7a10: 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70  eLock){.  if( !p
7a20: 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  Fd->pMethods ){.
7a30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7a40: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
7a50: 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  rn sqlite3OsUnlo
7a60: 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a  ck(pFd, eLock);.
7a70: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
7a80: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
7a90: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
7aa0: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
7ab0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
7ac0: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
7ad0: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
7ae0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
7af0: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
7b00: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
7b10: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7b20: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
7b30: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
7b40: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
7b50: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
7b60: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
7b70: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
7b80: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
7b90: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
7ba0: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
7bb0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
7bc0: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
7bd0: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
7be0: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
7bf0: 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
7c00: 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74  e used, 0 is ret
7c10: 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e  urned. If it can
7c20: 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65   be used,.** the
7c30: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
7c40: 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65  rned is the size
7c50: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
7c60: 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  file when it.** 
7c70: 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63  contains rollbac
7c80: 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74  k data for exact
7c90: 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  ly one page..*/.
7ca0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7cb0: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
7cc0: 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  E.static int jrn
7cd0: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
7ce0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
7cf0: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
7d00: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
7d10: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69  teristics */.  i
7d20: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
7d30: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
7d40: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
7d50: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
7d60: 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ize */.  sqlite3
7d70: 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67  _file *fd = pPag
7d80: 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66  er->fd;..  if( f
7d90: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
7da0: 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f     dc = sqlite3O
7db0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
7dc0: 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20  istics(fd);.    
7dd0: 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nSector = sqlite
7de0: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64  3OsSectorSize(fd
7df0: 29 3b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 70  );.    nPage = p
7e00: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
7e10: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 53  .  }..  assert(S
7e20: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
7e30: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
7e40: 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54  ;.  assert(SQLIT
7e50: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
7e60: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
7e70: 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65 74  .  if( !fd->pMet
7e80: 68 6f 64 73 20 7c 7c 20 28 64 63 26 28 53 51 4c  hods || (dc&(SQL
7e90: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
7ea0: 7c 28 6e 50 61 67 65 3e 3e 38 29 29 26 26 6e 53  |(nPage>>8))&&nS
7eb0: 65 63 74 6f 72 3c 3d 6e 50 61 67 65 29 20 29 7b  ector<=nPage) ){
7ec0: 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  .    return JOUR
7ed0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7ee0: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
7ef0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
7f00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
7f10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
7f20: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
7f30: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
7f40: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
7f50: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72  within the pager
7f60: 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69  .** code. The fi
7f70: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
7f80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
7f90: 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
7fa0: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
7fb0: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
7fc0: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
7fd0: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
7fe0: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  PI function. .**
7ff0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
8000: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
8010: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
8020: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
8030: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
8040: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
8050: 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49  ment is SQLITE_I
8060: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
8070: 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RUPT, or SQLITE_
8080: 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  FULL.** the erro
8090: 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73  r becomes persis
80a0: 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20  tent. Until the 
80b0: 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20  persisten error 
80c0: 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73  is cleared,.** s
80d0: 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61  ubsequent API ca
80e0: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65  lls on this Page
80f0: 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
8100: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
8110: 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  me .** error cod
8120: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69  e..**.** A persi
8130: 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69  stent error indi
8140: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
8150: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
8160: 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
8170: 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
8180: 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
8190: 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
81a0: 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
81b0: 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
81c0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
81d0: 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
81e0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
81f0: 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
8200: 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
8210: 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e  or occured, then
8220: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
8230: 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a  urnal may need.*
8240: 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64  * to be replayed
8250: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8260: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
8270: 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74  ger *pPager);.st
8280: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
8290: 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
82a0: 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
82b0: 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
82c0: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20  ff;.  assert(.  
82d0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
82e0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
82f0: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
8300: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
8310: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
8320: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
8330: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
8340: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
8350: 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  f(.    rc2==SQLI
8360: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72  TE_FULL ||.    r
8370: 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  c2==SQLITE_IOERR
8380: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
8390: 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b  ITE_CORRUPT.  ){
83a0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
83b0: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69  Code = rc;.    i
83c0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
83d0: 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26  ==PAGER_UNLOCK &
83e0: 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  & pPager->nRef==
83f0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
8400: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   the pager is al
8410: 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ready unlocked, 
8420: 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  call pager_unloc
8430: 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20  k() now to.     
8440: 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 65 72   ** clear the er
8450: 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 65 6e  ror state and en
8460: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
8470: 67 65 72 2d 63 61 63 68 65 20 69 73 20 0a 20 20  ger-cache is .  
8480: 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c      ** completel
8490: 79 20 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a  y empty..      *
84a0: 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e  /.      pager_un
84b0: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
84c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
84d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
84e0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
84f0: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
8500: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
8510: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
8520: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
8530: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
8540: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
8550: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
8560: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
8570: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
8580: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
8590: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
85a0: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
85b0: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
85c0: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
85d0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
85e0: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
85f0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
8600: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
8610: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
8620: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
8630: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
8640: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
8650: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
8660: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
8670: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
8680: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
8690: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
86a0: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
86b0: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
86c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a  ger->pageSize, .
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 20 20 20 20 20 20 20 20 28 75 6e 73 69 67 6e 65          (unsigne
86f0: 64 20 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54  d char *)PGHDR_T
8700: 4f 5f 44 41 54 41 28 70 50 61 67 65 29 29 3b 0a  O_DATA(pPage));.
8710: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
8720: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
8730: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
8740: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
8750: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
8760: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
8770: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
8780: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
8790: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
87a0: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
87b0: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
87c0: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
87d0: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
87e0: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
87f0: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
8800: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
8810: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
8820: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
8830: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
8840: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
8850: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
8860: 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61  assert( !pPg->pa
8870: 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72  geHash || pPager
8880: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d  ->errCode || MEM
8890: 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79  DB || pPg->dirty
88a0: 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e   || .      pPg->
88b0: 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f  pageHash==pager_
88c0: 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b  pagehash(pPg) );
88d0: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .}..#else.#defin
88e0: 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  e pager_datahash
88f0: 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65  (X,Y)  0.#define
8900: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
8910: 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48  X)  0.#define CH
8920: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
8930: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  if../*.** When t
8940: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
8950: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
8960: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
8970: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
8980: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
8990: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
89a0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65   read from the e
89b0: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
89c0: 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  nd .** written i
89d0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c  nto memory suppl
89e0: 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
89f0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65  r. .**.** zMaste
8a00: 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  r must point to 
8a10: 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
8a20: 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74  east nMaster byt
8a30: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
8a40: 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  ** the caller. T
8a50: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71  his should be sq
8a60: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
8a70: 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72  name+1 (to ensur
8a80: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e  e there is.** en
8a90: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72  ough space to wr
8aa0: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
8ab0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66  ournal name). If
8ac0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8ad0: 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  nal.** name in t
8ae0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f  he journal is lo
8af0: 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65  nger than nMaste
8b00: 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69  r bytes (includi
8b10: 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  ng a.** nul-term
8b20: 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68  inator), then th
8b30: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  is is handled as
8b40: 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   if no master jo
8b50: 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65  urnal name.** we
8b60: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
8b70: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
8b80: 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   If no master jo
8b90: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
8ba0: 69 73 20 70 72 65 73 65 6e 74 20 7a 4d 61 73 74  is present zMast
8bb0: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
8bc0: 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  0 and.** SQLITE_
8bd0: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
8be0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
8bf0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
8c00: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
8c10: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
8c20: 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b 0a 20   int nMaster){. 
8c30: 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c   int rc;.  u32 l
8c40: 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20  en;.  i64 szJ;. 
8c50: 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e   u32 cksum;.  in
8c60: 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
8c70: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
8c80: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
8c90: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
8ca0: 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74  ader */..  zMast
8cb0: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  er[0] = '\0';.. 
8cc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
8cd0: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
8ce0: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
8cf0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a  SQLITE_OK || szJ
8d00: 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b  <16 ) return rc;
8d10: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
8d20: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
8d30: 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20  6, &len);.  if( 
8d40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8d50: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
8d60: 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 29  ( len>=nMaster )
8d70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8d80: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
8d90: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8da0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
8db0: 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21  ksum);.  if( rc!
8dc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8dd0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
8de0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
8df0: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  rnl, aMagic, 8, 
8e00: 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20 72 63  szJ-8);.  if( rc
8e10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d  !=SQLITE_OK || m
8e20: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
8e30: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
8e40: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
8e50: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
8e60: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
8e70: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
8e80: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
8e90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8ea0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
8eb0: 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20   zMaster[len] = 
8ec0: 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65 65 20  '\0';..  /* See 
8ed0: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
8ee0: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
8ef0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
8f00: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
8f10: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
8f20: 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b  ksum -= zMaster[
8f30: 69 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28 20 63  i];.   }.  if( c
8f40: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
8f50: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
8f60: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
8f70: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
8f80: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
8f90: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
8fa0: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
8fb0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
8fc0: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
8fd0: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
8fe0: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
8ff0: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
9000: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9010: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
9020: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
9030: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
9040: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  me..    */.    z
9050: 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27  Master[0] = '\0'
9060: 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75  ;.  }.   .  retu
9070: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9080: 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20  ./*.** Seek the 
9090: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
90a0: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e  criptor to the n
90b0: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
90c0: 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a  ary where a.** j
90d0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61  ournal header ma
90e0: 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  y be read or wri
90f0: 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72  tten. Pager.jour
9100: 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65  nalOff is update
9110: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65  d with.** the ne
9120: 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a  w seek offset..*
9130: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
9140: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
9150: 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f  2:.**.** Input O
9160: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
9170: 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74     Output Offset
9180: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
9190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30  -----------.** 0
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31           0.** 51
91d0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
91e0: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31          512.** 1
91f0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
9200: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
9210: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
9220: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
9230: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  * .*/.static voi
9240: 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  d seekJournalHdr
9250: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
9260: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
9270: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
9280: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
9290: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
92a0: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
92b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
92c0: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
92d0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
92e0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
92f0: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
9300: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9310: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
9320: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
9330: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
9340: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
9350: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
9360: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9370: 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  ff = offset;.}..
9380: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a 65 72 6f  /*.** Write zero
9390: 73 20 6f 76 65 72 20 74 68 65 20 68 65 61 64 65  s over the heade
93a0: 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
93b0: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 68 61 73   file.  This has
93c0: 20 74 68 65 0a 2a 2a 20 65 66 66 65 63 74 20 6f   the.** effect o
93d0: 66 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74  f invalidating t
93e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
93f0: 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74  and committing t
9400: 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  he.** transactio
9410: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
9420: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
9430: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
9440: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
9450: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
9460: 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63  E_OK;.  static c
9470: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
9480: 72 5b 32 38 5d 3b 0a 0a 20 20 69 66 28 20 70 50  r[28];..  if( pP
9490: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
94a0: 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
94b0: 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22  ("JZEROHDR %p\n"
94c0: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69  , pPager)).    i
94d0: 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 29 7b  f( doTruncate ){
94e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
94f0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
9500: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
9510: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9520: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
9530: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
9540: 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66   zeroHdr, sizeof
9550: 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20  (zeroHdr), 0);. 
9560: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
9570: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9580: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9590: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
95a0: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
95b0: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
95c0: 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
95d0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
95e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
95f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
9600: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
9610: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
9620: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
9630: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
9640: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
9650: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
9660: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
9670: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
9680: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
9690: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
96a0: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
96b0: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
96c0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
96d0: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
96e0: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
96f0: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
9700: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
9710: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
9720: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
9730: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
9740: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
9750: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
9760: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
9770: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
9780: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
9790: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
97a0: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
97b0: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
97c0: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
97d0: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
97e0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
97f0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
9800: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
9810: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
9820: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
9830: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
9840: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9850: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
9860: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
9870: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
9880: 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 48  E_OK;.  char *zH
9890: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
98a0: 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 6e 74  pTmpSpace;.  int
98b0: 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65   nHeader = pPage
98c0: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69  r->pageSize;.  i
98d0: 6e 74 20 6e 57 72 69 74 65 3b 0a 0a 20 20 69 66  nt nWrite;..  if
98e0: 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41  ( nHeader>JOURNA
98f0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9900: 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
9910: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
9920: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
9930: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
9940: 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  tHdrOff==0 ){.  
9950: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
9960: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
9970: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a  ournalOff;.  }..
9980: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
9990: 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
99a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
99b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
99c0: 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 7a  Off;..  memcpy(z
99d0: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
99e0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
99f0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a  ournalMagic));..
9a00: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
9a10: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
9a20: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
9a30: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
9a40: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
9a50: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
9a60: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
9a70: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
9a80: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
9a90: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
9aa0: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
9ab0: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
9ac0: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
9ad0: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
9ae0: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
9af0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
9b00: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
9b10: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
9b20: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
9b30: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
9b40: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
9b50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
9b60: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
9b70: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
9b80: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
9b90: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
9ba0: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
9bb0: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
9bc0: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
9bd0: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
9be0: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
9bf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9c00: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
9c10: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
9c20: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
9c30: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
9c40: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
9c50: 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20   occured whilst 
9c60: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
9c70: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
9c80: 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   it may contain 
9c90: 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74  some garbage dat
9ca0: 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  a. There are two
9cb0: 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20   scenarios.  ** 
9cc0: 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20  where this risk 
9cd0: 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a  can be ignored:.
9ce0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
9cf0: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
9d00: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
9d10: 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20   Corruption can 
9d20: 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20  follow a.  **   
9d30: 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20    power failure 
9d40: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79  in this case any
9d50: 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  way..  **.  **  
9d60: 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49   * When the SQLI
9d70: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
9d80: 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74  PEND flag is set
9d90: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
9da0: 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20  s.  **     that 
9db0: 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20  garbage data is 
9dc0: 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74  never appended t
9dd0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
9de0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
9df0: 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
9e00: 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
9e10: 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20 28  noSync);.  if( (
9e20: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20  pPager->noSync) 
9e30: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
9e40: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
9e50: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
9e60: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
9e70: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
9e80: 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  ){.    put32bits
9e90: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
9ea0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
9eb0: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
9ec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75 74 33   }else{.    put3
9ed0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
9ee0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9ef0: 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a  gic)], 0);.  }..
9f00: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
9f10: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
9f20: 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c  aliser */ .  sql
9f30: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
9f40: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
9f50: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
9f60: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
9f70: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
9f80: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
9f90: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
9fa0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9fb0: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
9fc0: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
9fd0: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
9fe0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
9ff0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
a000: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  8], pPager->dbSi
a010: 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73  ze);.  /* The as
a020: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
a030: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
a040: 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ss */.  put32bit
a050: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
a060: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
a070: 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65  +12], pPager->se
a080: 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28  ctorSize);.  if(
a090: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a0a0: 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Hdr==0 ){.    /*
a0b0: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a   The page size *
a0c0: 2f 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  /.    put32bits(
a0d0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
a0e0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
a0f0: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
a100: 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f  Size);.  }..  fo
a110: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
a120: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
a130: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
a140: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
a150: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
a160: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
a170: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
a180: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
a190: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
a1a0: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
a1b0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
a1c0: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
a1d0: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
a1e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
a1f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
a200: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
a210: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
a220: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
a230: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
a240: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
a250: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
a260: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
a270: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
a280: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
a290: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
a2a0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
a2b0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
a2c0: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63  l.** file. See c
a2d0: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
a2e0: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
a2f0: 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64  nalHdr() for a d
a300: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
a310: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
a320: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
a330: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
a340: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
a350: 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73  ully, *nRec is s
a360: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
a370: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
a380: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
a390: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64  is header and *d
a3a0: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
a3b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
a3c0: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
a3d0: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
a3e0: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
a3f0: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
a400: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
a410: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
a420: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
a430: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
a440: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
a450: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
a460: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
a470: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
a480: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
a490: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
a4a0: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
a4b0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
a4c0: 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69   *nRec and *dbSi
a4d0: 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20  ze are not set. 
a4e0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
a4f0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
a500: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
a510: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
a520: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
a530: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
a540: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
a550: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
a560: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36  r *pPager, .  i6
a570: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20  4 journalSize,. 
a580: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20   u32 *pNRec, .  
a590: 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a  u32 *pDbSize.){.
a5a0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
a5b0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
a5c0: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
a5d0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
a5e0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
a5f0: 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 6e  64 jrnlOff;.  in
a600: 74 20 69 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  t iPageSize;..  
a610: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
a620: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
a630: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a640: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
a650: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
a660: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
a670: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
a680: 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d  .  }.  jrnlOff =
a690: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a6a0: 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  Off;..  rc = sql
a6b0: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
a6c0: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
a6d0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
a6e0: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20  jrnlOff);.  if( 
a6f0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
a700: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a    jrnlOff += siz
a710: 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20  eof(aMagic);..  
a720: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
a730: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
a740: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
a750: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
a760: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
a770: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64    }..  rc = read
a780: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
a790: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52  fd, jrnlOff, pNR
a7a0: 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ec);.  if( rc ) 
a7b0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
a7c0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
a7d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
a7e0: 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e 63  ff+4, &pPager->c
a7f0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
a800: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a810: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
a820: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
a830: 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53   jrnlOff+8, pDbS
a840: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
a850: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
a860: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a870: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
a880: 4f 66 66 2b 31 36 2c 20 28 75 33 32 20 2a 29 26  Off+16, (u32 *)&
a890: 69 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66  iPageSize);.  if
a8a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a8b0: 0a 20 20 20 26 26 20 69 50 61 67 65 53 69 7a 65  .   && iPageSize
a8c0: 3e 3d 35 31 32 20 0a 20 20 20 26 26 20 69 50 61  >=512 .   && iPa
a8d0: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
a8e0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
a8f0: 20 26 26 20 28 28 69 50 61 67 65 53 69 7a 65 2d   && ((iPageSize-
a900: 31 29 26 69 50 61 67 65 53 69 7a 65 29 3d 3d 30  1)&iPageSize)==0
a910: 20 0a 20 20 29 7b 0a 20 20 20 20 75 31 36 20 70   .  ){.    u16 p
a920: 61 67 65 73 69 7a 65 20 3d 20 69 50 61 67 65 53  agesize = iPageS
a930: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
a940: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
a950: 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 70  esize(pPager, &p
a960: 61 67 65 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  agesize);.  }.  
a970: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
a980: 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  rc;..  /* Update
a990: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
a9a0: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
a9b0: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
a9c0: 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72   by .  ** the pr
a9d0: 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
a9e0: 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
a9f0: 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
aa00: 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65   was.  ** create
aa10: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f  d by a process o
aa20: 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f  ther than this o
aa30: 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ne, then this ro
aa40: 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65  utine.  ** is be
aa50: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
aa60: 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
aa70: 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
aa80: 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66  al value.  ** of
aa90: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
aaa0: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74  e is restored at
aab0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
aac0: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20   routine..  */. 
aad0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
aae0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
aaf0: 6e 6c 4f 66 66 2b 31 32 2c 20 28 75 33 32 20 2a  nlOff+12, (u32 *
ab00: 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  )&pPager->sector
ab10: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
ab20: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
ab30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ab40: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
ab50: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
ab60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ab70: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
ab80: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
ab90: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
aba0: 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
abb0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
abc0: 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
abd0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
abe0: 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
abf0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
ac00: 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
ac10: 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
ac20: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
ac30: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
ac40: 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
ac50: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
ac60: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
ac70: 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
ac80: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
ac90: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
aca0: 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
acb0: 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
acc0: 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
acd0: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
ace0: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20  R_MJ_PGNO..** + 
acf0: 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20  N bytes: length 
ad00: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
ad10: 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62  l name..** + 4 b
ad20: 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62  ytes: N.** + 4 b
ad30: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
ad40: 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73  rnal name checks
ad50: 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73  um..** + 8 bytes
ad60: 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
ad70: 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
ad80: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
ad90: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
ada0: 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
adb0: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
adc0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  ** journal name.
add0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65  .**.** If zMaste
ade0: 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  r is a NULL poin
adf0: 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20  ter (occurs for 
ae00: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
ae10: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  e transaction), 
ae20: 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73  .** this call is
ae30: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
ae40: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73  tic int writeMas
ae50: 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  terJournal(Pager
ae60: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
ae70: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
ae80: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
ae90: 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a  len; .  int i; .
aea0: 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20    i64 jrnlOff;. 
aeb0: 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 0a 20   i64 jrnlSize;. 
aec0: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a   u32 cksum = 0;.
aed0: 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65    char zBuf[size
aee0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
aef0: 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21  )+2*4];..  if( !
af00: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
af10: 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65  r->setMaster) re
af20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
af30: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
af40: 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20  ter = 1;..  len 
af50: 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  = strlen(zMaster
af60: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
af70: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
af80: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
af90: 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  i];.  }..  /* If
afa0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
afb0: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
afc0: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
afd0: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
afe0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
aff0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
b000: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
b010: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
b020: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
b030: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
b040: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
b050: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
b060: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
b070: 79 6e 63 20 29 7b 0a 20 20 20 20 73 65 65 6b 4a  ync ){.    seekJ
b080: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
b090: 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66  );.  }.  jrnlOff
b0a0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
b0b0: 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
b0c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
b0d0: 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d  len+20);..  rc =
b0e0: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
b0f0: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
b100: 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
b110: 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
b120: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b130: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72   return rc;.  jr
b140: 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20 72  nlOff += 4;..  r
b150: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
b160: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
b170: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a 72  zMaster, len, jr
b180: 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63  nlOff);.  if( rc
b190: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
b1a0: 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f  turn rc;.  jrnlO
b1b0: 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75  ff += len;..  pu
b1c0: 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65  t32bits(zBuf, le
b1d0: 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  n);.  put32bits(
b1e0: 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29  &zBuf[4], cksum)
b1f0: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66  ;.  memcpy(&zBuf
b200: 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  [8], aJournalMag
b210: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
b220: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63  nalMagic));.  rc
b230: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
b240: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
b250: 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a  Buf, 8+sizeof(aJ
b260: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a 72  ournalMagic), jr
b270: 6e 6c 4f 66 66 29 3b 0a 20 20 6a 72 6e 6c 4f 66  nlOff);.  jrnlOf
b280: 66 20 2b 3d 20 38 2b 73 69 7a 65 6f 66 28 61 4a  f += 8+sizeof(aJ
b290: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20  ournalMagic);.  
b2a0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
b2b0: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
b2c0: 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  nc;..  /* If the
b2d0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
b2e0: 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
b2f0: 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
b300: 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
b310: 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
b320: 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
b330: 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
b340: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
b350: 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
b360: 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
b370: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
b380: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
b390: 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
b3a0: 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
b3b0: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
b3c0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
b3d0: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
b3e0: 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
b3f0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
b400: 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
b410: 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
b420: 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
b430: 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
b440: 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
b450: 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
b460: 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
b470: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
b480: 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
b490: 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
b4a0: 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
b4b0: 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
b4c0: 29 0a 20 20 20 26 26 20 28 72 63 20 3d 20 73 71  ).   && (rc = sq
b4d0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
b4e0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72  pPager->jfd, &jr
b4f0: 6e 6c 53 69 7a 65 29 29 3d 3d 53 51 4c 49 54 45  nlSize))==SQLITE
b500: 5f 4f 4b 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69  _OK.   && jrnlSi
b510: 7a 65 3e 6a 72 6e 6c 4f 66 66 0a 20 20 29 7b 0a  ze>jrnlOff.  ){.
b520: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b530: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
b540: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 29  r->jfd, jrnlOff)
b550: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b560: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
b570: 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65  or remove a page
b580: 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
b590: 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74  f all pages that
b5a0: 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73   are in the.** s
b5b0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
b5c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65  ..**.** The Page
b5d0: 72 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61  r keeps a separa
b5e0: 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  te list of pages
b5f0: 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
b600: 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74  tly in.** the st
b610: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
b620: 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65    This helps the
b630: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
b640: 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75  tCommit().** rou
b650: 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61  tine run MUCH fa
b660: 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d  ster for the com
b670: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
b680: 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a  here are many.**
b690: 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79   pages in memory
b6a0: 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20   but only a few 
b6b0: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
b6c0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  ment journal..*/
b6d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b6e0: 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
b6f0: 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  st(PgHdr *pPg){.
b700: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
b710: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
b720: 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
b730: 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
b740: 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
b750: 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 20    assert( MEMDB 
b760: 29 3b 0a 20 20 69 66 28 20 21 70 48 69 73 74 2d  );.  if( !pHist-
b770: 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 61  >inStmt ){.    a
b780: 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 50  ssert( pHist->pP
b790: 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 48  revStmt==0 && pH
b7a0: 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  ist->pNextStmt==
b7b0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
b7c0: 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ger->pStmt ){.  
b7d0: 20 20 20 20 50 47 48 44 52 5f 54 4f 5f 48 49 53      PGHDR_TO_HIS
b7e0: 54 28 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c  T(pPager->pStmt,
b7f0: 20 70 50 61 67 65 72 29 2d 3e 70 50 72 65 76 53   pPager)->pPrevS
b800: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  tmt = pPg;.    }
b810: 0a 20 20 20 20 70 48 69 73 74 2d 3e 70 4e 65 78  .    pHist->pNex
b820: 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e  tStmt = pPager->
b830: 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 61 67 65  pStmt;.    pPage
b840: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a  r->pStmt = pPg;.
b850: 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
b860: 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 1;.  }.}../*
b870: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
b880: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
b890: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
b8a0: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
b8b0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
b8c0: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
b8d0: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
b8e0: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
b8f0: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
b900: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
b910: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
b920: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65   *p;.  if( pPage
b930: 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65  r->aHash==0 ) re
b940: 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50  turn 0;.  p = pP
b950: 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f  ager->aHash[pgno
b960: 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
b970: 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20  h-1)];.  while( 
b980: 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67  p && p->pgno!=pg
b990: 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d  no ){.    p = p-
b9a0: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
b9b0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
b9c0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69  *.** Clear the i
b9d0: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
b9e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
b9f0: 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
ba00: 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63  of the pager bac
ba10: 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73  k to what it was
ba20: 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72   when it was fir
ba30: 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41  st.** opened.  A
ba40: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ny outstanding p
ba50: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
ba60: 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75  ated and subsequ
ba70: 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ent attempts.** 
ba80: 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20  to access those 
ba90: 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  pages will likel
baa0: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  y result in a co
bab0: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69  redump..*/.stati
bac0: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
bad0: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
bae0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
baf0: 20 2a 70 4e 65 78 74 3b 0a 23 69 66 6e 64 65 66   *pNext;.#ifndef
bb00: 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f   SQLITE_MUTEX_NO
bb10: 4f 50 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  OP.  sqlite3_mut
bb20: 65 78 20 2a 6d 75 74 65 78 3b 0a 23 65 6e 64 69  ex *mutex;.#endi
bb30: 66 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  f.  if( pPager->
bb40: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
bb50: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
bb60: 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 6d 75  _MUTEX_NOOP.  mu
bb70: 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
bb80: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
bb90: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
bba0: 4d 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  M2);.  sqlite3_m
bbb0: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
bbc0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72  );.#endif..  for
bbd0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
bbe0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
bbf0: 74 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  t){.    IOTRACE(
bc00: 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e  ("PGFREE %p %d\n
bc10: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
bc20: 70 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45  pgno));.    PAGE
bc30: 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
bc40: 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
bc50: 74 29 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t);.    pNext = 
bc60: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
bc70: 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65     lruListRemove
bc80: 28 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pPg);.    sqlit
bc90: 65 33 5f 66 72 65 65 28 70 50 67 2d 3e 70 44 61  e3_free(pPg->pDa
bca0: 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ta);.    sqlite3
bcb0: 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  _free(pPg);.  }.
bcc0: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
bcd0: 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30 29 3b  >lru.pFirst==0);
bce0: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
bcf0: 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
bd00: 65 64 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74  ed==0);.  assert
bd10: 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 4c 61  (pPager->lru.pLa
bd20: 73 74 3d 3d 30 29 3b 0a 20 20 70 50 61 67 65 72  st==0);.  pPager
bd30: 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  ->pStmt = 0;.  p
bd40: 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b  Pager->pAll = 0;
bd50: 0a 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74  .  pPager->pDirt
bd60: 79 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  y = 0;.  pPager-
bd70: 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71  >nHash = 0;.  sq
bd80: 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
bd90: 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61  r->aHash);.  pPa
bda0: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
bdb0: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20    pPager->aHash 
bdc0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
bdd0: 52 65 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Ref = 0;.  sqlit
bde0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
bdf0: 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  utex);.}../*.** 
be00: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
be10: 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ase file. .**.**
be20: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
be30: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
be40: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
be50: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
be60: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
be70: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
be80: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
be90: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
bea0: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
beb0: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
bec0: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
bed0: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
bee0: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
bef0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
bf00: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
bf10: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
bf20: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
bf30: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
bf40: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
bf50: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
bf60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
bf70: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
bf80: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
bf90: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
bfa0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  veMode ){.    if
bfb0: 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
bfc0: 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 55 6e 6c    int rc = osUnl
bfd0: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
bfe0: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
bff0: 69 66 28 20 72 63 20 29 20 70 50 61 67 65 72 2d  if( rc ) pPager-
c000: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
c010: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
c020: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ize = -1;.      
c030: 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  IOTRACE(("UNLOCK
c040: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
c050: 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79  ..      /* Alway
c060: 73 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  s close the jour
c070: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
c080: 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
c090: 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ase lock..      
c0a0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
c0b0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
c0c0: 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
c0d0: 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 0a  de=delete might.
c0e0: 20 20 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20        ** delete 
c0f0: 74 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72 6f  the file out fro
c100: 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20  m under us..    
c110: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
c120: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
c130: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  en ){.        sq
c140: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
c150: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
c160: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c170: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  alOpen = 0;.    
c180: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
c190: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
c1a0: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
c1b0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49        pPager->pI
c1c0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
c1d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
c1e0: 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
c1f0: 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
c200: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
c210: 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
c220: 62 65 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 73  be.      ** trus
c230: 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
c240: 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20  e pager file is 
c250: 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f  unlocked, the co
c260: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20  ntents of the.  
c270: 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e      ** cache can
c280: 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61 6e   be discarded an
c290: 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
c2a0: 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e   safely cleared.
c2b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c2c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
c2d0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ode ){.        i
c2e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c2f0: 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   ) pPager->errCo
c300: 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
c310: 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
c320: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
c330: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
c340: 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
c350: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
c360: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74  Close(pPager->st
c370: 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  fd);.          s
c380: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
c390: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53  roy(pPager->pInS
c3a0: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
c3b0: 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
c3c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
c3d0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
c3e0: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  tmtOpen = 0;.   
c3f0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
c400: 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
c410: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
c420: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
c430: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
c440: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
c450: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c460: 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
c470: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
c480: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30  ->origDbSize = 0
c490: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c4a0: 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
c4b0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
c4c0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
c4d0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
c4e0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
c4f0: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 50 61 67 65  OCK;.      pPage
c500: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
c510: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ne = 0;.    }.  
c520: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  }.}../*.** Execu
c530: 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
c540: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
c550: 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
c560: 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
c570: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
c580: 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
c590: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
c5a0: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a  error state, .**
c5b0: 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
c5c0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f  the rollback..*/
c5d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
c5e0: 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
c5f0: 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ack(Pager *p){. 
c600: 20 2f 2a 20 61 73 73 65 72 74 28 20 70 2d 3e 73   /* assert( p->s
c610: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
c620: 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e  RVED || p->journ
c630: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 20 2a 2f 0a  alOpen==0 ); */.
c640: 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65    if( p->errCode
c650: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
c660: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
c670: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
c680: 71 6c 69 74 65 33 46 61 75 6c 74 42 65 67 69 6e  qlite3FaultBegin
c690: 42 65 6e 69 67 6e 28 2d 31 29 3b 0a 20 20 20 20  Benign(-1);.    
c6a0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
c6b0: 62 61 63 6b 28 70 29 3b 0a 20 20 20 20 73 71 6c  back(p);.    sql
c6c0: 69 74 65 33 46 61 75 6c 74 45 6e 64 42 65 6e 69  ite3FaultEndBeni
c6d0: 67 6e 28 2d 31 29 3b 0a 20 20 7d 0a 20 20 70 61  gn(-1);.  }.  pa
c6e0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 23  ger_unlock(p);.#
c6f0: 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
c700: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d  ->errCode || !p-
c710: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
c720: 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  (p->exclusiveMod
c730: 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  e&&!p->journalOf
c740: 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
c750: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
c760: 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d  ->stmtOpen || p-
c770: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
c780: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
c790: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
c7a0: 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
c7b0: 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f  n.  A transactio
c7c0: 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65 69  n is ended by ei
c7d0: 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54  ther.** a COMMIT
c7e0: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a   or a ROLLBACK..
c7f0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
c800: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
c810: 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73  d, the pager has
c820: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c830: 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20  e open and.** a 
c840: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
c850: 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
c860: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
c870: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
c880: 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61  elease.** the da
c890: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
c8a0: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
c8b0: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
c8c0: 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a  ace if that is.*
c8d0: 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
c8e0: 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20  e thing to do.  
c8f0: 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73  Release locks us
c900: 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72  ually is appropr
c910: 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20  iate,.** unless 
c920: 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73  we are in exclus
c930: 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20  ive access mode 
c940: 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69  or unless this i
c950: 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41  s a .** COMMIT A
c960: 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c  ND BEGIN or ROLL
c970: 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f  BACK AND BEGIN o
c980: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
c990: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
c9a0: 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65 74   is either delet
c9b0: 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e  ed or truncated.
c9c0: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
c9d0: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
c9e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
c9f0: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
ca00: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
ca10: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
ca20: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
ca30: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
ca40: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
ca50: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
ca60: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
ca70: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
ca80: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
ca90: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
caa0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
cab0: 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 50 67 48  asMaster){.  PgH
cac0: 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
cad0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
cae0: 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
caf0: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
cb00: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
cb10: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
cb20: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
cb30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cb40: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
cb50: 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
cb60: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
cb70: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
cb80: 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65  en && !pPager->e
cb90: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
cba0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
cbb0: 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  se(pPager->stfd)
cbc0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
cbd0: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  mtOpen = 0;.  }.
cbe0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
cbf0: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
cc00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
cc10: 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20  lusiveMode .    
cc20: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
cc30: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
cc40: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
cc50: 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ST.    ){.      
cc60: 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
cc70: 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
cc80: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61  aster);.      pa
cc90: 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
cca0: 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61  , rc);.      pPa
ccb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ccc0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
ccd0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
cce0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
ccf0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
cd00: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
cd10: 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  fd);.      pPage
cd20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
cd30: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
cd40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
cd50: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
cd60: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
cd70: 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
cd80: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
cd90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
cda0: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
cdb0: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
cdc0: 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
cdd0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
cde0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
cdf0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
ce00: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
ce10: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
ce20: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
ce30: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
ce40: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
ce50: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
ce60: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61   0;.      pPg->a
ce70: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
ce80: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
ce90: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
cea0: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
ceb0: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
cec0: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
ced0: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
cee0: 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
cef0: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
cf00: 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  che = 0;.    pPa
cf10: 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
cf20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
cf30: 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
cf40: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ournal==0 );.  }
cf50: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
cf60: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
cf70: 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e  {.    rc2 = osUn
cf80: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
cf90: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
cfa0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
cfb0: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
cfc0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
cfd0: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
cfe0: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
cff0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
d000: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
d010: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
d020: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
d030: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
d040: 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
d050: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
d060: 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73    lruListSetFirs
d070: 74 53 79 6e 63 65 64 28 70 50 61 67 65 72 29 3b  tSynced(pPager);
d080: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
d090: 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72  e = -1;.  pPager
d0a0: 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30  ->dbModified = 0
d0b0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
d0c0: 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
d0d0: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c);.}../*.** Com
d0e0: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
d0f0: 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74  a checksum for t
d100: 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  he page of data.
d110: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
d120: 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
d130: 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c  um.  It is reall
d140: 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
d150: 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
d160: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61   initial value a
d170: 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  nd the page numb
d180: 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65  er.  We experime
d190: 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63  nted with.** a c
d1a0: 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65  hecksum of the e
d1b0: 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20  ntire data, but 
d1c0: 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74  that was found t
d1d0: 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a  o be too slow..*
d1e0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
d1f0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
d200: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
d210: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
d220: 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65  a and.** the che
d230: 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20  cksum is stored 
d240: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69  at the end.  Thi
d250: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  s is important. 
d260: 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63   If journal.** c
d270: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
d280: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
d290: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
d2a0: 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69  t likely scenari
d2b0: 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65  o.** is that one
d2c0: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
d2d0: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
d2e0: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
d2f0: 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20    It is.** much 
d300: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
d310: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
d320: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
d330: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
d340: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
d350: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
d360: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
d370: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
d380: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
d390: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
d3a0: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
d3b0: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
d3c0: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  rruption..**.** 
d3d0: 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65  FIX ME:  Conside
d3e0: 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32  r adding every 2
d3f0: 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74  00th (or so) byt
d400: 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f  e of the data to
d410: 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d   the.** checksum
d420: 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61  .  That way if a
d430: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61   single page spa
d440: 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73  ns 3 or more dis
d450: 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a  k sectors and.**
d460: 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65   only the middle
d470: 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75   sector is corru
d480: 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c  pt, we will stil
d490: 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61  l have a reasona
d4a0: 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66  ble.** chance of
d4b0: 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65   failing the che
d4c0: 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64  cksum and thus d
d4d0: 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f  etecting the pro
d4e0: 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blem..*/.static 
d4f0: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
d500: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
d510: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
d520: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
d530: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
d540: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  ;.  int i = pPag
d550: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
d560: 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  ;.  while( i>0 )
d570: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
d580: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
d590: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
d5a0: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
d5b0: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
d5c0: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76  tion */.static v
d5d0: 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67  oid makeClean(Pg
d5e0: 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  Hdr*);../*.** Re
d5f0: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
d600: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
d610: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e  l file opened on
d620: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
d630: 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61  .** jfd.  Playba
d640: 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65  ck this one page
d650: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b  ..**.** If useCk
d660: 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  sum==0 it means 
d670: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  this journal doe
d680: 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73  s not use checks
d690: 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a  ums.  Checksums.
d6a0: 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ** are not used 
d6b0: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  in statement jou
d6c0: 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74  rnals because st
d6d0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
d6e0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20   do not.** need 
d6f0: 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72  to survive power
d700: 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74   failures..*/.st
d710: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
d720: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
d730: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
d740: 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  r, .  sqlite3_fi
d750: 6c 65 20 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f  le *jfd,.  i64 o
d760: 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 75 73 65  ffset,.  int use
d770: 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72  Cksum.){.  int r
d780: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
d7b0: 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  g page in the ca
d7c0: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  che */.  Pgno pg
d7d0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
d7e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
d7f0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70  ge number of a p
d800: 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  age in journal *
d810: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73    /* Checksum us
d840: 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68  ed for sanity ch
d850: 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ecking */.  u8 *
d860: 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50  aData = (u8 *)pP
d870: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
d880: 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
d890: 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f  ge for a page */
d8a0: 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20  ..  /* useCksum 
d8b0: 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66  should be true f
d8c0: 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  or the main jour
d8d0: 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f  nal and false fo
d8e0: 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  r.  ** statement
d8f0: 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69   journals.  Veri
d900: 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20  fy that this is 
d910: 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
d920: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a    */.  assert( j
d930: 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20  fd == (useCksum 
d940: 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
d950: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b  pPager->stfd) );
d960: 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
d970: 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64   );..  rc = read
d980: 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73  32bits(jfd, offs
d990: 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
d9a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d9b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
d9c0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
d9d0: 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50  d(jfd, aData, pP
d9e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
d9f0: 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 69 66 28  offset+4);.  if(
da00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
da10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
da20: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
da30: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
da40: 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20  Size + 4;..  /* 
da50: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
da60: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
da70: 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
da80: 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
da90: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
daa0: 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
dab0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
dac0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
dad0: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
dae0: 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
daf0: 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
db00: 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
db10: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
db20: 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
db30: 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
db40: 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
db50: 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
db60: 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
db70: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
db80: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
db90: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
dba0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
dbb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
dbc0: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
dbd0: 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  o>(unsigned)pPag
dbe0: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
dbf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
dc00: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73  OK;.  }.  if( us
dc10: 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63  eCksum ){.    rc
dc20: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
dc30: 64 2c 20 6f 66 66 73 65 74 2b 70 50 61 67 65 72  d, offset+pPager
dc40: 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63  ->pageSize+4, &c
dc50: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
dc60: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
dc70: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
dc80: 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
dc90: 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
dca0: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
dcb0: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
dcc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
dcd0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
dce0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
dcf0: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
dd00: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
dd10: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
dd20: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
dd30: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
dd40: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
dd50: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
dd60: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
dd70: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
dd80: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
dd90: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
dda0: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
ddb0: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
ddc0: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
ddd0: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
dde0: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
ddf0: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
de00: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
de10: 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
de20: 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
de30: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
de40: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
de50: 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
de60: 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
de70: 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
de80: 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
de90: 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
dea0: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
deb0: 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
dec0: 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
ded0: 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
dee0: 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
def0: 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
df00: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
df10: 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
df20: 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
df30: 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
df40: 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
df50: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
df60: 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
df70: 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
df80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
df90: 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65   EXCLUSIVE state
dfa0: 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65  , then we update
dfb0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
dfc0: 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20   if it exists.  
dfd0: 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20  ** and the main 
dfe0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
dff0: 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f  s then marked no
e000: 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20  t dirty..  **.  
e010: 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
e020: 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
e030: 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
e040: 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
e050: 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
e060: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
e070: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
e080: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
e090: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
e0a0: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
e0b0: 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
e0c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
e0d0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
e0e0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
e0f0: 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
e100: 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
e110: 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
e120: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
e130: 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
e140: 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
e150: 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
e160: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
e170: 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
e180: 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
e190: 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
e1a0: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e  contents are syn
e1b0: 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ced into the mai
e1c0: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
e1d0: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
e1e0: 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73  ise, a power los
e1f0: 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f  s might leave mo
e200: 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74  dified data in t
e210: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
e220: 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e   file without an
e230: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f   entry in the ro
e240: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
e250: 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73  hat can.  ** res
e260: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
e270: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
e280: 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e  l form.  Two con
e290: 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a  ditions must be.
e2a0: 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20    ** met before 
e2b0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
e2c0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28  atabase files. (
e2d0: 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
e2e0: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63  must be.  ** loc
e2f0: 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
e300: 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
e310: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
e320: 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64   is fully synced
e330: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69  .  ** in the mai
e340: 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
e350: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
e360: 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
e370: 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74  e or else.  ** t
e380: 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  he page is marke
e390: 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
e3a0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38  ..  **.  ** 2008
e3b0: 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74  -04-14:  When at
e3c0: 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75  tempting to vacu
e3d0: 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  um a corrupt dat
e3e0: 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20  abase file, it. 
e3f0: 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
e400: 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d  to fail a statem
e410: 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ent on a databas
e420: 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
e430: 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20  yet exist..  ** 
e440: 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
e450: 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62  o write if datab
e460: 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76  ase file has nev
e470: 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  er been opened..
e480: 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67    */.  pPg = pag
e490: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
e4a0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52  , pgno);.  PAGER
e4b0: 54 52 41 43 45 34 28 22 50 4c 41 59 42 41 43 4b  TRACE4("PLAYBACK
e4c0: 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
e4d0: 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
e4e0: 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
e4f0: 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
e500: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
e510: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e520: 2c 20 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28  , aData));.  if(
e530: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
e540: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
e550: 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50  && (pPg==0 || pP
e560: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 0a  g->needSync==0).
e570: 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
e580: 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
e590: 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  ){.    i64 offse
e5a0: 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
e5b0: 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
e5c0: 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
e5d0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
e5e0: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70  er->fd, aData, p
e5f0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
e600: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66   offset);.    if
e610: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d  ( pPg ){.      m
e620: 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
e630: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
e640: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
e650: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
e660: 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
e670: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
e680: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
e690: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
e6a0: 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
e6b0: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
e6c0: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
e6d0: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
e6e0: 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
e6f0: 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
e700: 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
e710: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
e720: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
e730: 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
e740: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
e750: 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
e760: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
e770: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
e780: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
e790: 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a  d *pData;.    /*
e7a0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
e7b0: 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67  ef==0 || pPg->pg
e7c0: 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20  no==1 ); */.    
e7d0: 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
e7e0: 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20  _DATA(pPg);.    
e7f0: 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44  memcpy(pData, aD
e800: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
e810: 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
e820: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
e830: 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
e840: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
e850: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
e860: 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  ze);.    }.#ifde
e870: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
e880: 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
e890: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
e8a0: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
e8b0: 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
e8c0: 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
e8d0: 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
e8e0: 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
e8f0: 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
e900: 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
e910: 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
e920: 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
e930: 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
e940: 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
e950: 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
e960: 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
e970: 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
e980: 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
e990: 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
e9a0: 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
e9b0: 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
e9c0: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
e9d0: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
e9e0: 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   3);.  }.  retur
e9f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
ea00: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
ea10: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
ea20: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
ea30: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
ea40: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
ea50: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
ea60: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ea70: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
ea80: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
ea90: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
eaa0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
eab0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
eac0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
ead0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
eae0: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
eaf0: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
eb00: 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
eb10: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
eb20: 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
eb30: 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
eb40: 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
eb50: 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
eb60: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
eb70: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  **.**.** The mas
eb80: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
eb90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
eba0: 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64  mes of all child
ebb0: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f   journals..** To
ebc0: 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65   tell if a maste
ebd0: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
ebe0: 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20   deleted, check 
ebf0: 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  to each of the.*
ec00: 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20  * children.  If 
ec10: 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65  all children are
ec20: 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20   either missing 
ec30: 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20  or do not refer 
ec40: 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e  to.** a differen
ec50: 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
ec60: 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74  , then this mast
ec70: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
ec80: 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74  e deleted..*/.st
ec90: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
eca0: 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
ecb0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
ecc0: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
ecd0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
ece0: 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
ecf0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
ed00: 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20  t master_open = 
ed10: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  0;.  sqlite3_fil
ed20: 65 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71  e *pMaster;.  sq
ed30: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
ed40: 72 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d  rnal;.  char *zM
ed50: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
ed60: 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
ed70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ed80: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
ed90: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
eda0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
edb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
edc0: 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e  le */..  /* Open
edd0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ede0: 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69  nal file exclusi
edf0: 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d  vely in case som
ee00: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a  e other process.
ee10: 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20    ** is running 
ee20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  this routine als
ee30: 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d  o. Not that it m
ee40: 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69  akes too much di
ee50: 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  fference..  */. 
ee60: 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
ee70: 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
ee80: 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e  e3_malloc(pVfs->
ee90: 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
eea0: 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
eeb0: 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
eec0: 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
eed0: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
eee0: 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
eef0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
ef00: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
ef10: 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
ef20: 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
ef30: 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
ef40: 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
ef50: 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
ef60: 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
ef70: 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
ef80: 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
ef90: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
efa0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
efb0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d  lmaster_out;.  m
efc0: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a  aster_open = 1;.
efd0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
efe0: 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
eff0: 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
f000: 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
f010: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
f020: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
f030: 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75    if( nMasterJou
f040: 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68  rnal>0 ){.    ch
f050: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20  ar *zJournal;.  
f060: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
f070: 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  tr = 0;.    int 
f080: 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 50 61  nMasterPtr = pPa
f090: 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
f0a0: 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a  hname+1;..    /*
f0b0: 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
f0c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f0d0: 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
f0e0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
f0f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c    ** sqlite3_mal
f100: 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
f110: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
f120: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a  ournal. .    */.
f130: 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
f140: 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  al = (char *)sql
f150: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4d 61 73  ite3_malloc(nMas
f160: 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
f170: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 69 66  sterPtr);.    if
f180: 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
f190: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
f1a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f1b0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
f1c0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  er_out;.    }.  
f1d0: 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26    zMasterPtr = &
f1e0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
f1f0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a  MasterJournal];.
f200: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f210: 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20  OsRead(pMaster, 
f220: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
f230: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  nMasterJournal, 
f240: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
f250: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
f260: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
f270: 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
f280: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
f290: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
f2a0: 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
f2b0: 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
f2c0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
f2d0: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
f2e0: 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
f2f0: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
f300: 45 58 49 53 54 53 29 3b 0a 20 20 20 20 20 20 69  EXISTS);.      i
f310: 66 28 20 72 63 21 3d 30 20 26 26 20 72 63 21 3d  f( rc!=0 && rc!=
f320: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  1 ){.        rc 
f330: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
f340: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f  OMEM;.        go
f350: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
f360: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f370: 69 66 28 20 72 63 3d 3d 31 20 29 7b 0a 20 20 20  if( rc==1 ){.   
f380: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
f390: 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
f3a0: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
f3b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
f3c0: 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  sts..        ** 
f3d0: 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
f3e0: 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
f3f0: 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
f400: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20  rnal. If.       
f410: 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
f420: 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
f430: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f440: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
f450: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
f460: 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  c;.        int f
f470: 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
f480: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
f490: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
f4a0: 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20  URNAL);.        
f4b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
f4c0: 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  en(pVfs, zJourna
f4d0: 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61  l, pJournal, fla
f4e0: 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  gs, 0);.        
f4f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f500: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
f510: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
f520: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
f530: 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
f540: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f  asterJournal(pJo
f550: 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74  urnal, zMasterPt
f560: 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a  r, nMasterPtr);.
f570: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
f580: 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
f590: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
f5a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f5b0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
f5c0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
f5d0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
f5e0: 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
f5f0: 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
f600: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
f610: 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
f620: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
f630: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
f640: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
f650: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
f660: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
f670: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
f680: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
f690: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f6a0: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
f6b0: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72  += (strlen(zJour
f6c0: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
f6d0: 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
f6e0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
f6f0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
f700: 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
f710: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
f720: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
f730: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
f740: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
f750: 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65    if( master_ope
f760: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
f770: 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
f780: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
f790: 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
f7a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
f7b0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
f7c0: 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
f7d0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b  (Pager *pPager);
f7e0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
f7f0: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f   the main file o
f800: 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  f the given page
f810: 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  r to the number 
f820: 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69  of pages.** indi
f830: 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e  cated. Also trun
f840: 63 61 74 65 20 74 68 65 20 63 61 63 68 65 64 20  cate the cached 
f850: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
f860: 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  f the file..**.*
f870: 2a 20 4d 69 67 68 74 20 6d 69 67 68 74 20 62 65  * Might might be
f880: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
f890: 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
f8a0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
f8b0: 6e 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63  nPage..** This c
f8c0: 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65  an happen, for e
f8d0: 78 61 6d 70 6c 65 2c 20 69 66 20 77 65 20 61 72  xample, if we ar
f8e0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
f8f0: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
f900: 0a 2a 2a 20 77 68 69 63 68 20 68 61 73 20 65 78  .** which has ex
f910: 74 65 6e 64 65 64 20 74 68 65 20 66 69 6c 65 20  tended the file 
f920: 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 65 77  size and the new
f930: 20 70 61 67 65 73 20 61 72 65 20 73 74 69 6c 6c   pages are still
f940: 20 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20   all held.** in 
f950: 63 61 63 68 65 2c 20 74 68 65 6e 20 61 6e 20 49  cache, then an I
f960: 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20  NSERT or UPDATE 
f970: 64 6f 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74  does a statement
f980: 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65   rollback.  Some
f990: 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
f9a0: 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
f9b0: 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
f9c0: 66 75 73 65 64 20 69 66 20 79 6f 75 20 74 72 79  fused if you try
f9d0: 20 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20   to.** truncate 
f9e0: 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73  a file to some s
f9f0: 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67  ize that is larg
fa00: 65 72 20 74 68 61 6e 20 69 74 20 63 75 72 72 65  er than it curre
fa10: 6e 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64  ntly is,.** so d
fa20: 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
fa30: 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
fa40: 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
fa50: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e  the end of the n
fa60: 65 77 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65  ew.** file inste
fa70: 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ad..*/.static in
fa80: 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
fa90: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
faa0: 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  int nPage){.  in
fab0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
fac0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
fad0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
fae0: 4c 55 53 49 56 45 20 26 26 20 70 50 61 67 65 72  LUSIVE && pPager
faf0: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
fb00: 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e  {.    i64 curren
fb10: 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a  tSize, newSize;.
fb20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fb30: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
fb40: 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53  r->fd, &currentS
fb50: 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a  ize);.    newSiz
fb60: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
fb70: 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b  Size*(i64)nPage;
fb80: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
fb90: 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e  ITE_OK && curren
fba0: 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29  tSize!=newSize )
fbb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72  {.      if( curr
fbc0: 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20  entSize>newSize 
fbd0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
fbe0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
fbf0: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65  e(pPager->fd, ne
fc00: 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  wSize);.      }e
fc10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
fc20: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
fc30: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c  (pPager->fd, "",
fc40: 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a   1, newSize-1);.
fc50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fc60: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
fc70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
fc80: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
fc90: 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74  age;.    pager_t
fca0: 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
fcb0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
fcc0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fcd0: 20 53 65 74 20 74 68 65 20 73 65 63 74 6f 72 53   Set the sectorS
fce0: 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ize for the give
fcf0: 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  n pager..**.** T
fd00: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
fd10: 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 62 69  s at least as bi
fd20: 67 20 61 73 20 74 68 65 20 73 65 63 74 6f 72 20  g as the sector 
fd30: 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a  size reported.**
fd40: 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
fd50: 74 6f 72 53 69 7a 65 28 29 2e 20 20 54 68 65 20  torSize().  The 
fd60: 6d 69 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20 73  minimum sector s
fd70: 69 7a 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a 73  ize is 512..*/.s
fd80: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
fd90: 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
fda0: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
fdb0: 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
fdc0: 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
fdd0: 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
fde0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
fdf0: 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  le ){.    /* Sec
fe00: 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
fe10: 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
fe20: 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
fe30: 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
fe40: 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
fe50: 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
fe60: 20 69 6e 20 77 68 63 69 68 20 63 61 73 65 20 74   in whcih case t
fe70: 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
fe80: 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
fe90: 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20  ll segfault..   
fea0: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
feb0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
fec0: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
fed0: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
fee0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
fef0: 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29  sectorSize<512 )
ff00: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
ff10: 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
ff20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
ff30: 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
ff40: 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
ff50: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
ff60: 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
ff70: 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
ff80: 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
ff90: 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
ffa0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
ffb0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
ffc0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
ffd0: 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
ffe0: 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
fff0: 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
10000 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
10010 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
10020 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
10030 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
10040 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
10050 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
10060 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
10070 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
10080 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
10090 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
100a0 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
100b0 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
100c0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
100d0 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
100e0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
100f0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
10100 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
10110 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
10120 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
10130 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
10140 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
10150 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
10160 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
10170 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
10180 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
10190 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
101a0 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
101b0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
101c0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
101d0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
101e0 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
101f0 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
10200 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
10210 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
10220 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
10230 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
10240 70 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28  page case..**  (
10250 37 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  7)  4 byte integ
10260 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
10270 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
10280 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
10290 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
102a0 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
102b0 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
102c0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
102d0 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
102e0 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
102f0 0a 2a 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65  .**  (8)  N byte
10300 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
10310 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
10320 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
10330 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
10340 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
10350 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
10360 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
10370 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
10380 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
10390 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
103a0 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
103b0 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
103c0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
103d0 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
103e0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
103f0 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
10400 2e 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20  ..**  (9)  Zero 
10410 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
10420 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
10430 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
10440 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
10450 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
10460 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
10470 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
10480 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
10490 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
104a0 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
104b0 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
104c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
104d0 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
104e0 74 20 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 8 items above.
104f0 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
10500 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
10510 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
10520 74 68 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 9th item..**
10530 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
10540 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
10550 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
10560 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
10570 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
10580 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
10590 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
105a0 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
105b0 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
105c0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
105d0 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
105e0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
105f0 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
10600 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
10610 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
10620 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
10630 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
10640 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
10650 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
10660 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
10670 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
10680 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
10690 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
106a0 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
106b0 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
106c0 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
106d0 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
106e0 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
106f0 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
10700 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
10710 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
10720 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
10730 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
10740 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
10750 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
10760 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
10770 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
10780 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
10790 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
107a0 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
107b0 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
107c0 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
107d0 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
107e0 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
107f0 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
10800 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
10810 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
10820 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
10830 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
10840 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
10850 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
10860 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
10870 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
10880 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
10890 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
108a0 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
108b0 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
108c0 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
108d0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
108e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
108f0 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
10900 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
10910 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
10920 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
10930 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
10940 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
10950 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
10960 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
10970 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
10980 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
10990 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
109a0 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
109b0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
109c0 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
109d0 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
109e0 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
109f0 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
10a00 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
10a10 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
10a20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
10a30 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
10a40 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
10a50 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
10a60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
10a70 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
10a80 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
10a90 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
10aa0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
10ab0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
10ac0 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
10ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10ae0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
10af0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
10b00 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10b20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
10b30 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
10b40 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10b60 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
10b70 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
10b80 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
10b90 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
10ba0 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
10bb0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
10be0 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
10bf0 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30  */.  int res = 0
10c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10c10 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
10c20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
10c30 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
10c40 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
10c50 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
10c60 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10c70 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f  e if any */..  /
10c80 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
10c90 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
10ca0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
10cb0 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
10cc0 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
10cd0 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
10ce0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
10cf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
10d00 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
10d10 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
10d20 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
10d30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10d40 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
10d50 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
10d60 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
10d70 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
10d80 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
10d90 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
10da0 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
10db0 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
10dc0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10dd0 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
10de0 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
10df0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
10e00 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
10e10 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
10e20 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
10e30 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
10e40 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
10e50 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74  ck..  */.  zMast
10e60 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
10e70 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72  pSpace;.  rc = r
10e80 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
10e90 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
10ea0 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
10eb0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
10ec0 31 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  1);.  if( rc!=SQ
10ed0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
10ee0 74 65 72 5b 30 5d 20 0a 20 20 20 26 26 20 28 72  ter[0] .   && (r
10ef0 65 73 3d 73 71 6c 69 74 65 33 4f 73 41 63 63 65  es=sqlite3OsAcce
10f00 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
10f10 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
10f20 45 58 49 53 54 53 29 29 3d 3d 30 20 29 20 0a 20  EXISTS))==0 ) . 
10f30 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
10f40 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  = 0;.    goto en
10f50 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
10f60 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
10f70 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
10f80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
10f90 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ERR_NOMEM;.    g
10fa0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
10fb0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10fc0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
10fd0 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
10fe0 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65  terminates eithe
10ff0 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a  r when the readJ
11000 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c  ournalHdr() call
11010 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51   returns.  ** SQ
11020 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
11030 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
11040 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
11050 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  {..    /* Read t
11060 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
11070 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
11080 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
11090 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
110a0 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
110b0 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
110c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
110d0 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
110e0 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
110f0 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
11100 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
11110 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69  st of failed whi
11120 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
11130 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
11140 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
11150 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
11160 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
11170 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
11180 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
11190 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
111a0 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
111b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
111c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
111d0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
111e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
111f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
11200 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
11210 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
11220 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
11230 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
11240 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
11250 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
11260 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
11270 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
11280 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
11290 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
112a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
112b0 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
112c0 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
112d0 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
112e0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
112f0 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
11300 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
11310 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
11320 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
11330 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
11340 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
11350 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
11360 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
11370 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
11380 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
11390 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f  nRec = (szJ - JO
113a0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
113b0 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
113c0 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20  _SZ(pPager);.   
113d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
113e0 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
113f0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
11400 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
11410 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
11420 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
11430 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
11440 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
11450 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
11460 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
11470 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
11480 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
11490 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
114a0 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
114b0 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
114c0 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
114d0 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
114e0 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
114f0 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
11500 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
11510 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
11520 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
11530 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
11540 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
11550 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
11560 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11570 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
11580 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
11590 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
115a0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
115b0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
115c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
115d0 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
115e0 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
115f0 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
11600 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
11610 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
11620 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
11630 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
11640 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
11650 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
11660 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
11670 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
11680 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
11690 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
116a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
116b0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
116c0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
116d0 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
116e0 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
116f0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
11700 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11710 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
11720 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
11730 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
11740 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
11750 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
11760 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
11770 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
11780 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
11790 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
117a0 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; i++){.      
117b0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
117c0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
117d0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
117e0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
117f0 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20  lOff, 1);.      
11800 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11810 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
11820 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
11830 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
11840 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11850 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
11860 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
11870 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
11880 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
11890 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
118a0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
118b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
118c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
118d0 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
118e0 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
118f0 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
11900 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11910 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  .    zMaster = p
11920 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
11930 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d  ;.    rc = readM
11940 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
11950 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
11960 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
11970 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
11980 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
11990 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
119a0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
119b0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
119c0 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c  , zMaster[0]!='\
119d0 30 27 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  0');.  }.  if( r
119e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
119f0 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
11a00 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
11a10 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
11a20 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
11a30 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
11a40 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20  success,.    ** 
11a50 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
11a60 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
11a70 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11a80 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  al..    */.    r
11a90 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
11aa0 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ter(pPager, zMas
11ab0 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter);.  }..  /* 
11ac0 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
11ad0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
11ae0 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
11af0 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
11b00 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
11b10 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
11b20 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
11b30 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
11b40 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
11b50 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
11b60 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
11b70 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
11b80 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
11b90 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
11ba0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11bb0 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
11bc0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
11bd0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
11be0 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
11bf0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
11c00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
11c10 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a  urnal but with.*
11c20 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77  * a few extra tw
11c30 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ists..**.**    (
11c40 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1)  The number o
11c50 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
11c60 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
11c70 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
11c80 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74          the stat
11c90 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  ement is stored 
11ca0 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  in pPager->stmtS
11cb0 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  ize, not in the.
11cc0 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e  **         journ
11cd0 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a  al file itself..
11ce0 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e  **.**    (2)  In
11cf0 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61   addition to pla
11d00 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74  ying back the st
11d10 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c  atement journal,
11d20 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20   also.**        
11d30 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61   playback all pa
11d40 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ges of the trans
11d50 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
11d60 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  eginning.**     
11d70 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50      at offset pP
11d80 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e  ager->stmtJSize.
11d90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
11da0 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
11db0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
11dc0 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11de0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c   Size of the ful
11df0 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  l journal */.  i
11e00 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74  64 hdrOff;.  int
11e10 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
11e20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11e30 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  of Records */.  
11e40 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
11e50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
11e60 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
11e70 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70  t rc;..  szJ = p
11e80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11e90 66 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72  f;..  /* Set hdr
11ea0 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66  Off to be the of
11eb0 66 73 65 74 20 6a 75 73 74 20 61 66 74 65 72 20  fset just after 
11ec0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
11ed0 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ast journal.  **
11ee0 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 62 65   page written be
11ef0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6a  fore the first j
11f00 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f  ournal-header fo
11f10 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  r this statement
11f20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
11f30 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f  n was written, o
11f40 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
11f50 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72   file if no jour
11f60 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  nal.  ** header 
11f70 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a  was written..  *
11f80 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61  /.  hdrOff = pPa
11f90 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b  ger->stmtHdrOff;
11fa0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11fb0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21  r->fullSync || !
11fc0 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20  hdrOff );.  if( 
11fd0 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68  !hdrOff ){.    h
11fe0 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  drOff = szJ;.  }
11ff0 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74  .  .  /* Truncat
12000 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  e the database b
12010 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
12020 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20  nal size..  */. 
12030 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
12040 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
12050 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a  ger->stmtSize);.
12060 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12070 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
12080 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46  HARED );..  /* F
12090 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
120a0 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
120b0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
120c0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
120d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
120e0 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61  stmtInUse && pPa
120f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
12100 20 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61   );.  nRec = pPa
12110 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20  ger->stmtNRec;. 
12120 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
12130 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
12140 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
12150 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
12160 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
12170 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
12180 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ote that the sta
12190 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f  tement journal o
121a0 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66  mits checksums f
121b0 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65  rom.  ** each re
121c0 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72  cord since power
121d0 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72  -failure recover
121e0 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61  y is not importa
121f0 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a  nt to statement.
12200 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20    ** journals.. 
12210 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
12220 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRec; i++){.   
12230 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 69 2a   i64 offset = i*
12240 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
12250 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  ize);.    rc = p
12260 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
12270 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
12280 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66  Pager->stfd, off
12290 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  set, 0);.    ass
122a0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
122b0 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
122c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
122d0 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
122e0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
122f0 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20  * Now roll some 
12300 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20  pages back from 
12310 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12320 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73  journal. Pager.s
12330 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61  tmtJSize.  ** wa
12340 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
12350 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
12360 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65  hen this stateme
12370 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  nt was started, 
12380 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69  so.  ** everythi
12390 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65  ng after that ne
123a0 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
123b0 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e   back, either in
123c0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
123d0 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79  base, the memory
123e0 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e   cache, or both.
123f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74  .  **.  ** If it
12400 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
12410 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72  en Pager.stmtHdr
12420 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65  Off is the offse
12430 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
12440 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
12450 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
12460 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74  written during t
12470 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
12480 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
12490 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
124a0 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  lOff = pPager->s
124b0 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67  tmtJSize;.  pPag
124c0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20  er->cksumInit = 
124d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
124e0 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67  m;.  while( pPag
124f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
12500 20 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72   hdrOff ){.    r
12510 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
12520 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
12530 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
12540 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12550 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  Off, 1);.    ass
12560 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
12570 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
12580 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12590 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
125a0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77  ayback;.  }..  w
125b0 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
125c0 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29  urnalOff < szJ )
125d0 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b  {.    u32 nJRec;
125e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
125f0 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
12600 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
12610 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
12620 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
12630 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a  pPager, szJ, &nJ
12640 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
12650 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12660 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
12670 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
12680 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f  DONE );.      go
12690 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
126a0 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  back;.    }.    
126b0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a  if( nJRec==0 ){.
126c0 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73        nJRec = (s
126d0 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
126e0 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67  rnalOff) / (pPag
126f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b  er->pageSize+8);
12700 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
12710 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26  =nJRec-1; i>=0 &
12720 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
12730 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29  lOff < szJ; i--)
12740 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
12750 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
12760 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
12770 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
12780 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29  ->journalOff, 1)
12790 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
127a0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
127b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
127c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
127d0 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
127e0 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ack;.    }.  }..
127f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12800 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65  lOff = szJ;.  .e
12810 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
12820 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
12830 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61  TE_OK) {.    pPa
12840 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
12850 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61  = szJ;.    /* pa
12860 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
12870 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d  (pPager); */.  }
12880 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12890 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
128a0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
128b0 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
128c0 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
128d0 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
128e0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
128f0 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
12900 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
12910 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
12920 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  10 ){.    pPager
12930 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
12940 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
12950 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
12960 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   10;.  }.}../*.*
12970 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
12980 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
12990 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
129a0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
129b0 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
129c0 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
129d0 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
129e0 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
129f0 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
12a00 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
12a10 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
12a20 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
12a30 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
12a40 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
12a50 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
12a60 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
12a70 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
12a80 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
12a90 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
12aa0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
12ab0 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
12ac0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
12ad0 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
12ae0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
12af0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12b00 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
12b10 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
12b20 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
12b30 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
12b40 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
12b50 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
12b60 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
12b70 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
12b80 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
12b90 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
12ba0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
12bb0 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
12bc0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
12bd0 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
12be0 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
12bf0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
12c00 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
12c10 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
12c20 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
12c30 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
12c40 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
12c50 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
12c60 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
12c70 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
12c80 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
12c90 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
12ca0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
12cb0 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
12cc0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
12cd0 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
12ce0 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
12cf0 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
12d00 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
12d20 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
12d30 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
12d40 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
12d50 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
12d60 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
12d70 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
12d80 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
12d90 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
12da0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
12db0 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
12dc0 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
12dd0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12de0 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
12df0 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
12e00 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
12e10 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
12e20 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
12e30 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
12e40 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
12e50 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
12e60 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
12e70 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
12e80 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
12e90 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
12ea0 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
12eb0 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
12ec0 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  er, int level, i
12ed0 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a  nt full_fsync){.
12ee0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
12ef0 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20   =  level==1 || 
12f00 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12f10 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
12f20 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20  Sync = level==3 
12f30 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
12f40 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
12f50 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 66 75  sync_flags = (fu
12f60 6c 6c 5f 66 73 79 6e 63 3f 53 51 4c 49 54 45 5f  ll_fsync?SQLITE_
12f70 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45  SYNC_FULL:SQLITE
12f80 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
12f90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
12fa0 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65  ync ) pPager->ne
12fb0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65  edSync = 0;.}.#e
12fc0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
12fd0 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
12fe0 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
12ff0 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
13000 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
13010 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
13020 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
13030 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
13040 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
13050 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
13060 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
13070 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
13080 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
13090 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
130a0 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
130b0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
130c0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a  porary file. .**
130d0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
130e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
130f0 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20  to *fd.  Return 
13100 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
13110 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20  cess or some.** 
13120 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
13130 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
13140 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
13150 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68  ically delete th
13160 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  e temporary.** f
13170 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
13180 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
13190 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65   int sqlite3Page
131a0 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 73 71 6c  rOpentemp(.  sql
131b0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
131c0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
131d0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 6c 61  l file system la
131e0 79 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  yer */.  sqlite3
131f0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
13200 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
13210 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
13220 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
13230 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e  ename,      /* N
13240 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ame of the file.
13250 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
13260 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
13270 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
13280 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
13290 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
132a0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
132b0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
132c0 65 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20  e!=0 );..#ifdef 
132d0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
132e0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
132f0 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
13300 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
13310 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
13320 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
13330 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
13340 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
13350 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
13360 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
13370 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
13380 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
13390 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
133a0 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
133b0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
133c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 6c 65  zFilename, pFile
133d0 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
133e0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
133f0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65  LITE_OK || pFile
13400 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20  ->pMethods );.  
13410 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13420 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
13430 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
13440 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
13450 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
13460 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20  in *ppPager..** 
13470 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  The file to be c
13480 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65  ached need not e
13490 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20  xist.  The file 
134a0 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e  is not locked un
134b0 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  til.** the first
134c0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
134d0 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69  PagerGet() and i
134e0 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e  s only held open
134f0 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61   until the.** la
13500 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
13510 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
13520 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a  3PagerUnref()..*
13530 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
13540 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
13550 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
13560 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
13570 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
13580 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
13590 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
135a0 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   The file will b
135b0 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
135c0 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
135d0 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
135e0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
135f0 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
13600 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  hen all informat
13610 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
13620 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e  ache..** It is n
13630 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
13640 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20  disk.  This can 
13650 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
13660 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65  ment an.** in-me
13670 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
13680 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
13690 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
136a0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
136b0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
136c0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
136d0 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
136e0 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
136f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
13700 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
13710 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
13720 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
13730 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
13740 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13750 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
13760 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
13770 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
13780 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
13790 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
137a0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
137b0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
137c0 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
137d0 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
137e0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
137f0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs             /
13800 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
13810 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
13820 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
13830 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
13840 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
13850 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
13860 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
13870 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   i;.  int tempFi
13880 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65  le = 0;.  int me
13890 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  mDb = 0;.  int r
138a0 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69  eadOnly = 0;.  i
138b0 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
138c0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
138d0 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
138e0 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
138f0 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
13900 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
13910 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61  =0;.  int journa
13920 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69  lFileSize = sqli
13930 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
13940 56 66 73 29 3b 0a 20 20 69 6e 74 20 6e 44 65 66  Vfs);.  int nDef
13950 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c 49 54  aultPage = SQLIT
13960 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
13970 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61  IZE;.  char *zPa
13980 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 50  thname;.  int nP
13990 61 74 68 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20  athname;.  char 
139a0 2a 7a 53 74 6d 74 4a 72 6e 6c 3b 0a 20 20 69 6e  *zStmtJrnl;.  in
139b0 74 20 6e 53 74 6d 74 4a 72 6e 6c 3b 0a 0a 20 20  t nStmtJrnl;..  
139c0 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 72  /* The default r
139d0 65 74 75 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20  eturn is a NULL 
139e0 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70  pointer */.  *pp
139f0 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Pager = 0;..  /*
13a00 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 75 6c   Compute the ful
13a10 6c 20 70 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  l pathname */.  
13a20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  nPathname = pVfs
13a30 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
13a40 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
13a50 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 50 61  lite3_malloc(nPa
13a60 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 69 66 28  thname*2);.  if(
13a70 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
13a80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13a90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
13aa0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
13ab0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
13ac0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13ad0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
13ae0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
13af0 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
13b00 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
13b10 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
13b20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
13b30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
13b40 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72  if.    {.      r
13b50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
13b60 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
13b70 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
13b80 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29  name, zPathname)
13b90 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
13ba0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13bb0 33 4f 73 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  3OsGetTempname(p
13bc0 56 66 73 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  Vfs, nPathname, 
13bd0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
13be0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13bf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
13c00 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
13c10 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
13c20 63 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 68 6e 61  c;.  }.  nPathna
13c30 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 50 61 74  me = strlen(zPat
13c40 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 50 75  hname);..  /* Pu
13c50 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
13c60 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 65 6d 70 6f  journal in tempo
13c70 72 61 72 79 20 64 69 73 6b 20 73 70 61 63 65 20  rary disk space 
13c80 73 69 6e 63 65 20 74 68 69 73 20 69 73 0a 20 20  since this is.  
13c90 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 52 41 4d  ** sometimes RAM
13ca0 20 64 69 73 6b 20 6f 72 20 6f 74 68 65 72 20 6f   disk or other o
13cb0 70 74 69 6d 69 7a 65 64 20 73 74 6f 72 61 67 65  ptimized storage
13cc0 2e 20 20 55 6e 6c 69 6b 65 6c 79 20 74 68 65 20  .  Unlikely the 
13cd0 6d 61 69 6e 0a 20 20 2a 2a 20 6d 61 69 6e 20 6a  main.  ** main j
13ce0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
13cf0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
13d00 61 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  al does not need
13d10 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 63 6f 6c   to be .  ** col
13d20 6f 63 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ocated with the 
13d30 64 61 74 61 62 61 73 65 20 6e 6f 72 20 64 6f 65  database nor doe
13d40 73 20 69 74 20 6e 65 65 64 20 74 6f 20 62 65 20  s it need to be 
13d50 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f  persistent..  */
13d60 0a 20 20 7a 53 74 6d 74 4a 72 6e 6c 20 3d 20 26  .  zStmtJrnl = &
13d70 7a 50 61 74 68 6e 61 6d 65 5b 6e 50 61 74 68 6e  zPathname[nPathn
13d80 61 6d 65 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73  ame+1];.  rc = s
13d90 71 6c 69 74 65 33 4f 73 47 65 74 54 65 6d 70 6e  qlite3OsGetTempn
13da0 61 6d 65 28 70 56 66 73 2c 20 70 56 66 73 2d 3e  ame(pVfs, pVfs->
13db0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 2c 20 7a 53  mxPathname+1, zS
13dc0 74 6d 74 4a 72 6e 6c 29 3b 0a 20 20 69 66 28 20  tmtJrnl);.  if( 
13dd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13de0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
13df0 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
13e00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
13e10 0a 20 20 6e 53 74 6d 74 4a 72 6e 6c 20 3d 20 73  .  nStmtJrnl = s
13e20 74 72 6c 65 6e 28 7a 53 74 6d 74 4a 72 6e 6c 29  trlen(zStmtJrnl)
13e30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
13e40 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
13e50 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
13e60 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71  */.  pPager = sq
13e70 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
13e80 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61  .    sizeof(*pPa
13e90 67 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20  ger) +          
13ea0 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
13eb0 75 72 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ure */.    journ
13ec0 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20 20 20  alFileSize +    
13ed0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
13ee0 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 72 75 63  urnal file struc
13ef0 74 75 72 65 20 2a 2f 20 0a 20 20 20 20 70 56 66  ture */ .    pVf
13f00 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 33 20  s->szOsFile * 3 
13f10 2b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  +        /* The 
13f20 6d 61 69 6e 20 64 62 20 61 6e 64 20 74 77 6f 20  main db and two 
13f30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
13f40 20 0a 20 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d   .    3*nPathnam
13f50 65 20 2b 20 34 30 20 2b 20 20 20 20 20 20 20 20  e + 40 +        
13f60 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20    /* zFilename, 
13f70 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75  zDirectory, zJou
13f80 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 6e 53 74 6d  rnal */.    nStm
13f90 74 4a 72 6e 6c 20 20 20 20 20 20 20 20 20 20 20  tJrnl           
13fa0 20 20 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74          /* zStmt
13fb0 4a 72 6e 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  Jrnl */.  );.  i
13fc0 66 28 20 21 70 50 61 67 65 72 20 29 7b 0a 20 20  f( !pPager ){.  
13fd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13fe0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
13ff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
14000 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 74 72 20 3d  EM;.  }.  pPtr =
14010 20 28 75 38 20 2a 29 26 70 50 61 67 65 72 5b 31   (u8 *)&pPager[1
14020 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  ];.  pPager->vfs
14030 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
14040 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
14050 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
14060 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
14070 46 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65  File*0];.  pPage
14080 72 2d 3e 73 74 66 64 20 3d 20 28 73 71 6c 69 74  r->stfd = (sqlit
14090 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70  e3_file*)&pPtr[p
140a0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 31 5d  Vfs->szOsFile*1]
140b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
140c0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
140d0 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f  )&pPtr[pVfs->szO
140e0 73 46 69 6c 65 2a 32 5d 3b 0a 20 20 70 50 61 67  sFile*2];.  pPag
140f0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
14100 28 63 68 61 72 2a 29 26 70 50 74 72 5b 70 56 66  (char*)&pPtr[pVf
14110 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 2b 6a 6f  s->szOsFile*2+jo
14120 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a  urnalFileSize];.
14130 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63    pPager->zDirec
14140 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e  tory = &pPager->
14150 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e  zFilename[nPathn
14160 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ame+1];.  pPager
14170 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50  ->zJournal = &pP
14180 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
14190 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20  [nPathname+1];. 
141a0 20 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72   pPager->zStmtJr
141b0 6e 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a  nl = &pPager->zJ
141c0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
141d0 2b 31 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  +10];.  pPager->
141e0 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 6d  pVfs = pVfs;.  m
141f0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
14200 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
14210 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29  me, nPathname+1)
14220 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65  ;.  memcpy(pPage
14230 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 2c 20 7a 53  r->zStmtJrnl, zS
14240 74 6d 74 4a 72 6e 6c 2c 20 6e 53 74 6d 74 4a 72  tmtJrnl, nStmtJr
14250 6e 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  nl+1);.  sqlite3
14260 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
14270 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
14280 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a   pager file..  *
14290 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
142a0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
142b0 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20  ] && !memDb ){. 
142c0 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61 6d 65     if( nPathname
142d0 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  >(pVfs->mxPathna
142e0 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d 6a 6f  me - sizeof("-jo
142f0 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20 20  urnal")) ){.    
14300 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
14310 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73  NTOPEN;.    }els
14320 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6f 75  e{.      int fou
14330 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
14340 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
14350 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46  pVfs, pPager->zF
14360 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
14370 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >fd,.           
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
14390 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 2c 20  ager->vfsFlags, 
143a0 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 72 65  &fout);.      re
143b0 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
143c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
143d0 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  NLY);..      /* 
143e0 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
143f0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
14400 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69  ned for read/wri
14410 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 20  te access,.     
14420 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
14430 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
14440 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
14450 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
14460 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
14470 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
14480 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
14490 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
144a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
144b0 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
144c0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
144d0 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65       **    + The
144e0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
144f0 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
14500 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20 20 2a  orSize().      *
14510 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65  *    + The large
14520 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61  st page size tha
14530 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  t can be written
14540 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20   atomically..   
14550 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
14560 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14570 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20   !readOnly ){.  
14580 20 20 20 20 20 20 69 6e 74 20 69 53 65 63 74 6f        int iSecto
14590 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f  rSize = sqlite3O
145a0 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  sSectorSize(pPag
145b0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20  er->fd);.       
145c0 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50 61 67   if( nDefaultPag
145d0 65 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29 7b  e<iSectorSize ){
145e0 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65 66 61  .          nDefa
145f0 75 6c 74 50 61 67 65 20 3d 20 69 53 65 63 74 6f  ultPage = iSecto
14600 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  rSize;.        }
14610 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14620 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
14630 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  TE.        {.   
14640 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d         int iDc =
14650 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
14660 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
14670 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
14680 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
14690 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
146a0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
146b0 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
146c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
146d0 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
146e0 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
146f0 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
14700 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
14710 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
14720 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a  E_SIZE<=65536);.
14730 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69            for(ii
14740 3d 6e 44 65 66 61 75 6c 74 50 61 67 65 3b 20 69  =nDefaultPage; i
14750 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  i<=SQLITE_MAX_DE
14760 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
14770 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20   ii=ii*2){.     
14780 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
14790 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
147a0 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 20 6e  MIC|(ii>>8)) ) n
147b0 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20 69 69  DefaultPage = ii
147c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
147d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
147e0 20 20 20 20 20 20 20 69 66 28 20 6e 44 65 66 61         if( nDefa
147f0 75 6c 74 50 61 67 65 3e 53 51 4c 49 54 45 5f 4d  ultPage>SQLITE_M
14800 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
14810 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
14820 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d    nDefaultPage =
14830 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
14840 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
14850 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14860 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
14870 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  f( !memDb ){.   
14880 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
14890 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
148a0 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
148b0 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
148c0 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
148d0 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
148e0 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
148f0 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
14900 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
14910 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
14920 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
14930 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
14940 74 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  te()..    */ .  
14950 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
14960 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
14970 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
14980 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  IVE;.  }..  if( 
14990 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53 51  pPager && rc==SQ
149a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
149b0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
149c0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
149d0 5a 65 72 6f 28 6e 44 65 66 61 75 6c 74 50 61 67  Zero(nDefaultPag
149e0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
149f0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
14a00 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
14a10 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e  he blocks above.
14a20 0a 20 20 2a 2a 20 46 72 65 65 20 74 68 65 20 50  .  ** Free the P
14a30 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
14a40 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
14a50 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 74 68  e..  ** Since th
14a60 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61  e pager is not a
14a70 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69  llocated there i
14a80 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74  s no need to set
14a90 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72   .  ** any Pager
14aa0 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c  .errMask variabl
14ab0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
14ac0 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61 67 65  pPager || !pPage
14ad0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  r->pTmpSpace ){.
14ae0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
14af0 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
14b00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14b10 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
14b20 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
14b30 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d  E_OK)?SQLITE_NOM
14b40 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50  EM:rc);.  }..  P
14b50 41 47 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e  AGERTRACE3("OPEN
14b60 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
14b70 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
14b80 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
14b90 6c 65 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41  lename);.  IOTRA
14ba0 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
14bb0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
14bc0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
14bd0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61  .  /* Fill in Pa
14be0 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d  ger.zDirectory[]
14bf0 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61   */.  memcpy(pPa
14c00 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
14c10 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
14c20 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29  me, nPathname+1)
14c30 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e  ;.  for(i=strlen
14c40 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
14c50 6f 72 79 29 3b 20 69 3e 30 20 26 26 20 70 50 61  ory); i>0 && pPa
14c60 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
14c70 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
14c80 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
14c90 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
14ca0 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a  [i-1] = 0;..  /*
14cb0 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a   Fill in Pager.z
14cc0 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 6d  Journal[] */.  m
14cd0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  emcpy(pPager->zJ
14ce0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
14cf0 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
14d00 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28  name);.  memcpy(
14d10 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
14d20 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
14d30 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 0a 20  journal", 9);.. 
14d40 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   /* pPager->jour
14d50 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  nalOpen = 0; */.
14d60 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
14d70 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61  rnal = useJourna
14d80 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70  l && !memDb;.  p
14d90 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
14da0 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26  k = noReadlock &
14db0 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  & readOnly;.  /*
14dc0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
14dd0 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
14de0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
14df0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
14e00 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
14e10 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
14e20 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20  ize = memDb-1;. 
14e30 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
14e40 65 20 3d 20 6e 44 65 66 61 75 6c 74 50 61 67 65  e = nDefaultPage
14e50 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
14e60 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
14e70 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
14e80 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
14e90 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
14ea0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
14eb0 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30  er->mxPage = 100
14ec0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  ;.  pPager->mxPg
14ed0 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
14ee0 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
14ef0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
14f00 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
14f10 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
14f20 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65  er->state == (te
14f30 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45  mpFile ? PAGER_E
14f40 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52  XCLUSIVE : PAGER
14f50 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a  _UNLOCK) );.  /*
14f60 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
14f70 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
14f80 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65  r->tempFile = te
14f90 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
14fa0 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
14fb0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
14fc0 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
14fd0 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
14fe0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
14ff0 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
15000 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
15010 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
15020 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
15030 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
15040 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  = tempFile; .  p
15050 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d  Pager->memDb = m
15060 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
15070 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
15080 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
15090 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
150a0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  */.  pPager->noS
150b0 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
150c0 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
150d0 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
150e0 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61  >fullSync = (pPa
150f0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29  ger->noSync?0:1)
15100 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
15110 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  _flags = SQLITE_
15120 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f  SYNC_NORMAL;.  /
15130 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
15140 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
15150 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
15160 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
15170 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
15180 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
15190 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41  nExtra = FORCE_A
151a0 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29  LIGNMENT(nExtra)
151b0 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
151c0 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
151d0 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70 46 69 6c 65  |memDb||tempFile
151e0 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20  );.  if( !memDb 
151f0 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74 6f 72  ){.    setSector
15200 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
15210 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
15220 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
15230 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28   */.  /* memset(
15240 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
15250 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
15260 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a  >aHash)); */.  *
15270 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
15280 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
15290 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
152a0 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65  NAGEMENT.  pPage
152b0 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b  r->iInUseMM = 0;
152c0 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73  .  pPager->iInUs
152d0 65 44 42 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  eDB = 0;.  if( !
152e0 6d 65 6d 44 62 20 29 7b 0a 23 69 66 6e 64 65 66  memDb ){.#ifndef
152f0 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f   SQLITE_MUTEX_NO
15300 4f 50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  OP.    sqlite3_m
15310 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71  utex *mutex = sq
15320 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
15330 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
15340 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e  TATIC_MEM2);.#en
15350 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
15360 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
15370 78 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  x);.    pPager->
15380 70 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 50  pNext = sqlite3P
15390 61 67 65 72 4c 69 73 74 3b 0a 20 20 20 20 69 66  agerList;.    if
153a0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69  ( sqlite3PagerLi
153b0 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  st ){.      asse
153c0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
153d0 4c 69 73 74 2d 3e 70 50 72 65 76 3d 3d 30 20 29  List->pPrev==0 )
153e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
153f0 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76 20  agerList->pPrev 
15400 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 7d 0a  = pPager;.    }.
15410 20 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65      pPager->pPre
15420 76 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  v = 0;.    sqlit
15430 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50  e3PagerList = pP
15440 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  ager;.    sqlite
15450 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
15460 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  tex);.  }.#endif
15470 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15480 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
15490 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
154a0 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  er function..*/.
154b0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
154c0 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
154d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42  Pager *pPager, B
154e0 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73  usyHandler *pBus
154f0 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61  yHandler){.  pPa
15500 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
15510 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72  r = pBusyHandler
15520 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
15530 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
15540 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
15550 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
15560 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61  destructor is ca
15570 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  lled.** when the
15580 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
15590 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65   on each page re
155a0 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65  aches zero.  The
155b0 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a   destructor can.
155c0 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c  ** be used to cl
155d0 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69  ean up informati
155e0 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20  on in the extra 
155f0 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64  segment appended
15600 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a   to each page..*
15610 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63  *.** The destruc
15620 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  tor is not calle
15630 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71  d as a result sq
15640 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
15650 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74  ).  .** Destruct
15660 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c  ors are only cal
15670 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 61  led by sqlite3Pa
15680 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76  gerUnref()..*/.v
15690 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
156a0 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 50 61  SetDestructor(Pa
156b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
156c0 64 20 28 2a 78 44 65 73 63 29 28 44 62 50 61 67  d (*xDesc)(DbPag
156d0 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  e*,int)){.  pPag
156e0 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
156f0 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  = xDesc;.}../*.*
15700 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74  * Set the reinit
15710 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73  ializer for this
15720 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
15730 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74  NULL, the reinit
15740 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61  ializer.** is ca
15750 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f  lled when the co
15760 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20  ntent of a page 
15770 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74  in cache is rest
15780 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
15790 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73  inal.** value as
157a0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72   a result of a r
157b0 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61  ollback.  The ca
157c0 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67  llback gives hig
157d0 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a  her-level code.*
157e0 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  * an opportunity
157f0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
15800 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f  EXTRA section to
15810 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
15820 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65  restored.** page
15830 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73   data..*/.void s
15840 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65  qlite3PagerSetRe
15850 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50  initer(Pager *pP
15860 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65  ager, void (*xRe
15870 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e  init)(DbPage*,in
15880 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
15890 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
158a0 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  it;.}../*.** Set
158b0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 74   the page size t
158c0 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49 66  o *pPageSize. If
158d0 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65 77   the suggest new
158e0 20 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a 2a   page size is.**
158f0 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20   inappropriate, 
15900 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74  then an alternat
15910 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  ive page size is
15920 20 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20   set to that.** 
15930 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
15940 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
15950 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
15960 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
15970 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65  ager, u16 *pPage
15980 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Size){.  int rc 
15990 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
159a0 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  16 pageSize = *p
159b0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
159c0 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
159d0 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
159e0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
159f0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
15a00 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 70 61  IZE) );.  if( pa
15a10 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
15a20 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65  ze!=pPager->page
15a30 53 69 7a 65 20 0a 20 20 20 26 26 20 21 70 50 61  Size .   && !pPa
15a40 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50  ger->memDb && pP
15a50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 0a 20  ager->nRef==0 . 
15a60 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e   ){.    char *pN
15a70 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
15a80 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 61 67 65  ite3_malloc(page
15a90 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Size);.    if( !
15aa0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
15ab0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
15ac0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15ad0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
15ae0 67 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ger);.      page
15af0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
15b00 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
15b10 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
15b20 7a 65 3b 0a 20 20 20 20 20 20 73 65 74 53 65 63  ze;.      setSec
15b30 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
15b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
15b50 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
15b60 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
15b70 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
15b80 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 61  = pNew;.      pa
15b90 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
15ba0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
15bb0 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
15bc0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72  r->pageSize;.  r
15bd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15be0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
15bf0 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
15c00 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
15c10 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
15c20 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
15c30 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
15c40 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
15c50 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
15c60 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
15c70 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
15c80 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
15c90 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
15ca0 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
15cb0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
15cc0 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
15cd0 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
15ce0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
15cf0 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
15d00 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
15d10 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
15d20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
15d30 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
15d40 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
15d50 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
15d60 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
15d70 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
15d80 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
15d90 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
15da0 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
15db0 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
15dc0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
15dd0 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
15de0 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
15df0 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
15e00 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
15e10 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
15e20 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
15e30 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
15e40 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
15e50 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
15e60 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
15e70 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
15e80 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
15e90 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
15ea0 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
15eb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
15ec0 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
15ed0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
15ee0 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
15ef0 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
15f00 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
15f10 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73   mxPage;.  }.  s
15f20 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
15f30 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
15f40 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
15f50 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
15f60 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
15f70 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
15f80 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
15f90 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
15fa0 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
15fb0 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
15fc0 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
15fd0 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
15fe0 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
15ff0 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
16000 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
16010 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
16020 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
16030 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
16040 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
16050 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
16060 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
16070 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
16080 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
16090 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
160a0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
160b0 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
160c0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
160d0 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
160e0 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
160f0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
16100 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
16110 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
16120 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
16130 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
16140 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
16150 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
16160 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
16170 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
16180 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
16190 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
161a0 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
161b0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
161c0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
161d0 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
161e0 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
161f0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
16200 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
16210 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
16220 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
16230 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
16240 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
16250 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
16260 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
16270 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69   No error checki
16280 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20  ng is done. The 
16290 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69  rational for thi
162a0 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  s is that this f
162b0 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20  unction .** may 
162c0 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69  be called even i
162d0 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
162e0 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e  not exist or con
162f0 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49  tain a header. I
16300 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65  n .** these case
16310 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  s sqlite3OsRead(
16320 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e  ) will return an
16330 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68   error, to which
16340 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a   the correct .**
16350 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20   response is to 
16360 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20  zero the memory 
16370 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e  at pDest and con
16380 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49  tinue.  A real I
16390 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c  O error .** will
163a0 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75   presumably recu
163b0 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20  r and be picked 
163c0 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20  up later (Todo: 
163d0 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
163e0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
163f0 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
16400 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
16410 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
16420 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
16430 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16440 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
16450 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
16460 20 61 73 73 65 72 74 28 4d 45 4d 44 42 7c 7c 70   assert(MEMDB||p
16470 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
16480 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d  ods||pPager->tem
16490 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 50  pFile);.  if( pP
164a0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
164b0 64 73 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  ds ){.    IOTRAC
164c0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
164d0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
164e0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
164f0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
16500 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
16510 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
16520 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
16530 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
16540 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16550 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
16560 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16570 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
16580 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
16590 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
165a0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
165b0 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a  h.** pPager. .**
165c0 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49  .** If the PENDI
165d0 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20  NG_BYTE lies on 
165e0 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c  the page directl
165f0 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  y after the end 
16600 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20  of the.** file, 
16610 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68  then consider th
16620 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20  is page part of 
16630 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f  the file too. Fo
16640 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
16650 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73   PENDING_BYTE is
16660 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20   byte 4096 (the 
16670 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61  first byte of pa
16680 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69  ge 5) and the si
16690 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ze of the.** fil
166a0 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c  e is 4096 bytes,
166b0 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   5 is returned i
166c0 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a  nstead of 4..*/.
166d0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
166e0 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
166f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
16700 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  n = 0;.  int rc;
16710 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16720 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  r!=0 );.  if( pP
16730 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
16740 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
16750 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
16760 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20  ->dbSize>=0 ){. 
16770 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64     n = pPager->d
16780 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20  bSize;.  } else 
16790 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61  {.    assert(pPa
167a0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
167b0 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  s||pPager->tempF
167c0 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ile);.    if( (p
167d0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
167e0 6f 64 73 29 0a 20 20 20 20 20 26 26 20 28 72 63  ods).     && (rc
167f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
16800 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
16810 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b   &n))!=SQLITE_OK
16820 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
16830 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
16840 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
16850 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70  er, rc);.      p
16860 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
16870 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
16880 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e      }.    if( n>
16890 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70  0 && n<pPager->p
168a0 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
168b0 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73   n = 1;.    }els
168c0 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50  e{.      n /= pP
168d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
168e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
168f0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
16900 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
16910 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
16920 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = n;.    }.  }
16930 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49  .  if( n==(PENDI
16940 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
16950 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  pageSize) ){.   
16960 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   n++;.  }.  if( 
16970 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n>pPager->mxPgno
16980 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
16990 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a  mxPgno = n;.  }.
169a0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
169b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
169c0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
169d0 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73  ** Clear a PgHis
169e0 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74  tory block.*/.st
169f0 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48  atic void clearH
16a00 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79  istory(PgHistory
16a10 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pHist){.  sqli
16a20 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e  te3_free(pHist->
16a30 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65  pOrig);.  sqlite
16a40 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53  3_free(pHist->pS
16a50 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70  tmt);.  pHist->p
16a60 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73  Orig = 0;.  pHis
16a70 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a  t->pStmt = 0;.}.
16a80 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c  #else.#define cl
16a90 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65  earHistory(x).#e
16aa0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  ndif../*.** Forw
16ab0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
16ac0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
16ad0 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a  ncJournal(Pager*
16ae0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  );../*.** Unlink
16af0 20 70 50 67 20 66 72 6f 6d 20 69 74 73 20 68 61   pPg from its ha
16b00 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73  sh chain. Also s
16b10 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  et the page numb
16b20 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63  er to 0 to indic
16b30 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ate.** that the 
16b40 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74  page is not part
16b50 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61   of any hash cha
16b60 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  in. This is requ
16b70 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65  ired because the
16b80 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
16b90 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69  Movepage() routi
16ba0 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70  ne can leave a p
16bb0 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70  age in the .** p
16bc0 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72  NextFree/pPrevFr
16bd0 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  ee list that is 
16be0 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e  not a part of an
16bf0 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f  y hash-chain..*/
16c00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
16c10 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67  inkHashChain(Pag
16c20 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
16c30 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
16c40 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  Pg->pgno==0 ){. 
16c50 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
16c60 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20  pNextHash==0 && 
16c70 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  pPg->pPrevHash==
16c80 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 );.    return;
16c90 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
16ca0 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
16cb0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
16cc0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
16cd0 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d  ->pPrevHash;.  }
16ce0 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
16cf0 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73  vHash ){.    ass
16d00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
16d10 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28  sh[pPg->pgno & (
16d20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
16d30 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  ]!=pPg );.    pP
16d40 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e  g->pPrevHash->pN
16d50 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
16d60 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73  NextHash;.  }els
16d70 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70  e{.    int h = p
16d80 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67  Pg->pgno & (pPag
16d90 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
16da0 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
16db0 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  h] = pPg->pNextH
16dc0 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d  ash;.  }.  if( M
16dd0 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61  EMDB ){.    clea
16de0 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54  rHistory(PGHDR_T
16df0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
16e00 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  er));.  }.  pPg-
16e10 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67  >pgno = 0;.  pPg
16e20 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
16e30 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
16e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
16e50 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  k a page from th
16e60 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65  e free list (the
16e70 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
16e80 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30  es where nRef==0
16e90 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74  ).** and from it
16ea0 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  s hash collision
16eb0 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   chain..*/.stati
16ec0 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67  c void unlinkPag
16ed0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
16ee0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
16ef0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
16f00 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
16f10 66 72 65 65 20 70 61 67 65 20 6c 69 73 74 20 2a  free page list *
16f20 2f 0a 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76  /.  lruListRemov
16f30 65 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 55 6e  e(pPg);..  /* Un
16f40 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67  link from the pg
16f50 6e 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  no hash table */
16f60 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  .  unlinkHashCha
16f70 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  in(pPager, pPg);
16f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
16f90 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
16fa0 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63  o truncate the c
16fb0 61 63 68 65 20 77 68 65 6e 20 61 20 64 61 74 61  ache when a data
16fc0 62 61 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63  base.** is trunc
16fd0 61 74 65 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d  ated.  Drop from
16fe0 20 74 68 65 20 63 61 63 68 65 20 61 6c 6c 20 70   the cache all p
16ff0 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20  ages whose pgno 
17000 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61  is.** larger tha
17010 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
17020 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65   and is unrefere
17030 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65  nced..**.** Refe
17040 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72  renced pages lar
17050 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
17060 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f  >dbSize are zero
17070 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c  ed..**.** Actual
17080 6c 79 2c 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ly, at the point
17090 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
170a0 20 63 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c   called, it woul
170b0 64 20 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  d be.** an error
170c0 20 74 6f 20 68 61 76 65 20 61 20 72 65 66 65 72   to have a refer
170d0 65 6e 63 65 64 20 70 61 67 65 2e 20 20 42 75 74  enced page.  But
170e0 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 65 6c   rather than del
170f0 65 74 65 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ete.** that page
17100 20 61 6e 64 20 67 75 61 72 61 6e 74 65 65 20 61   and guarantee a
17110 20 73 75 62 73 65 71 75 65 6e 74 20 73 65 67 66   subsequent segf
17120 61 75 6c 74 2c 20 69 74 20 73 65 65 6d 73 20 62  ault, it seems b
17130 65 74 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f  etter.** to zero
17140 20 69 74 20 61 6e 64 20 68 6f 70 65 20 74 68 61   it and hope tha
17150 74 20 77 65 20 65 72 72 6f 72 20 6f 75 74 20 73  t we error out s
17160 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  anely..*/.static
17170 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e   void pager_trun
17180 63 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72  cate_cache(Pager
17190 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
171a0 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72  dr *pPg;.  PgHdr
171b0 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64   **ppPg;.  int d
171c0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
171d0 64 62 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  dbSize;.#ifndef 
171e0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f  SQLITE_MUTEX_NOO
171f0 50 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  P.  sqlite3_mute
17200 78 20 2a 6d 75 74 65 78 3b 0a 20 20 6d 75 74 65  x *mutex;.  mute
17210 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
17220 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
17230 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32  UTEX_STATIC_MEM2
17240 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
17250 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
17260 6d 75 74 65 78 29 3b 0a 0a 20 20 70 70 50 67 20  mutex);..  ppPg 
17270 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  = &pPager->pAll;
17280 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d  .  while( (pPg =
17290 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20   *ppPg)!=0 ){.  
172a0 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
172b0 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  =dbSize ){.     
172c0 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e   ppPg = &pPg->pN
172d0 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  extAll;.    }els
172e0 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e  e if( pPg->nRef>
172f0 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
17300 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
17310 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
17320 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
17330 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
17340 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
17350 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20  se{.      *ppPg 
17360 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
17370 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
17380 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22  "PGFREE %p %d\n"
17390 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
173a0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
173b0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
173c0 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75  pager_pgfree_cou
173d0 6e 74 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e  nt);.      unlin
173e0 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  kPage(pPg);.    
173f0 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
17400 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
17410 66 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61 29  free(pPg->pData)
17420 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
17430 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  free(pPg);.     
17440 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d   pPager->nPage--
17450 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
17460 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
17470 65 28 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a  e(mutex);.}../*.
17480 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
17490 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c   a lock on a fil
174a0 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  e.  Invoke the b
174b0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
174c0 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63  the lock.** is c
174d0 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
174e0 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20  ilable.  Repeat 
174f0 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
17500 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a  allback returns.
17510 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ** false or unti
17520 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  l the lock succe
17530 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
17540 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
17550 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
17560 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
17570 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
17580 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  the lock..*/.sta
17590 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
175a0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
175b0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
175c0 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
175d0 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20  c;..  /* The OS 
175e0 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74  lock values must
175f0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
17600 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76  the Pager lock v
17610 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  alues */.  asser
17620 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d  t( PAGER_SHARED=
17630 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
17640 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
17650 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56  RESERVED==RESERV
17660 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
17670 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55  ert( PAGER_EXCLU
17680 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f  SIVE==EXCLUSIVE_
17690 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  LOCK );..  /* If
176a0 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72   the file is cur
176b0 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20  rently unlocked 
176c0 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75  then the size mu
176d0 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f  st be unknown */
176e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
176f0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
17700 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72  SHARED || pPager
17710 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45  ->dbSize<0 || ME
17720 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  MDB );..  if( pP
17730 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
17740 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20  ktype ){.    rc 
17750 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
17760 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50  else{.    if( pP
17770 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
17780 65 72 20 29 20 70 50 61 67 65 72 2d 3e 70 42 75  er ) pPager->pBu
17790 73 79 48 61 6e 64 6c 65 72 2d 3e 6e 42 75 73 79  syHandler->nBusy
177a0 20 3d 20 30 3b 0a 20 20 20 20 64 6f 20 7b 0a 20   = 0;.    do {. 
177b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
177c0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
177d0 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  fd, locktype);. 
177e0 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
177f0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71  QLITE_BUSY && sq
17800 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
17810 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
17820 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a  BusyHandler) );.
17830 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
17850 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c  Pager->state = l
17860 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49  ocktype;.      I
17870 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
17880 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
17890 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d  locktype)).    }
178a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
178b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
178c0 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
178d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
178e0 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ges specified..*
178f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
17900 65 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72  erTruncate(Pager
17910 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
17920 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
17930 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17940 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
17950 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20  SHARED || MEMDB 
17960 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
17970 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
17980 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
17990 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
179a0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
179b0 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  rCode;.    retur
179c0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
179d0 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64  nPage>=(unsigned
179e0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
179f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17a00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
17a10 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
17a20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
17a30 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65   nPage;.    page
17a40 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
17a50 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
17a60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17a70 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72    }.  pagerEnter
17a80 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
17a90 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
17aa0 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ger);.  pagerLea
17ab0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ve(pPager);.  if
17ac0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17ad0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17ae0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
17af0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
17b00 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
17b10 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
17b20 69 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45  ing. */.  pagerE
17b30 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
17b40 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
17b50 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
17b60 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
17b70 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
17b80 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
17b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17ba0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
17bb0 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  ..  rc = pager_t
17bc0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
17bd0 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  nPage);.  return
17be0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
17bf0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
17c00 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
17c10 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
17c20 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
17c30 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
17c40 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
17c50 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
17c60 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
17c70 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
17c80 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
17c90 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
17ca0 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
17cb0 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
17cc0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
17cd0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
17ce0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
17cf0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
17d00 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
17d10 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
17d20 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
17d30 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
17d40 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
17d50 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
17d60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
17d70 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
17d80 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
17d90 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
17da0 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
17db0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
17dc0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
17dd0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
17de0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
17df0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
17e00 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
17e10 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
17e20 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
17e30 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
17e40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17e50 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
17e60 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65   *pPager){.#ifde
17e70 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17e80 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
17e90 54 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29  T.  if( !MEMDB )
17ea0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
17eb0 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 20 20  _MUTEX_NOOP.    
17ec0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
17ed0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
17ee0 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
17ef0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
17f00 45 4d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  EM2);.#endif.   
17f10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
17f20 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20  nter(mutex);.   
17f30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 50 72   if( pPager->pPr
17f40 65 76 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ev ){.      pPag
17f50 65 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  er->pPrev->pNext
17f60 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74   = pPager->pNext
17f70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17f80 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c     sqlite3PagerL
17f90 69 73 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e  ist = pPager->pN
17fa0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
17fb0 66 28 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74  f( pPager->pNext
17fc0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
17fd0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
17fe0 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a   pPager->pPrev;.
17ff0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
18000 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
18010 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  tex);.  }.#endif
18020 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ..  disable_simu
18030 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
18040 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 61 75 6c  );.  sqlite3Faul
18050 74 42 65 67 69 6e 42 65 6e 69 67 6e 28 2d 31 29  tBeginBenign(-1)
18060 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ;.  pPager->errC
18070 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ode = 0;.  pPage
18080 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
18090 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65   = 0;.  pager_re
180a0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  set(pPager);.  p
180b0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
180c0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
180d0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
180e0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
180f0 20 73 71 6c 69 74 65 33 46 61 75 6c 74 45 6e 64   sqlite3FaultEnd
18100 42 65 6e 69 67 6e 28 2d 31 29 3b 0a 20 20 50 41  Benign(-1);.  PA
18110 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45  GERTRACE2("CLOSE
18120 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
18130 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52  pPager));.  IOTR
18140 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
18150 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 69 66  ", pPager)).  if
18160 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
18170 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
18180 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
18190 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  er->jfd);.  }.  
181a0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
181b0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
181c0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
181d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
181e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
181f0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
18200 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  tfd);.  }.  sqli
18210 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
18220 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d  r->fd);.  /* Tem
18230 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
18240 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
18250 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
18260 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
18270 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
18280 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
18290 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
182a0 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
182b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
182c0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
182d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
182e0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
182f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
18300 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
18310 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18320 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
18330 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
18340 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
18350 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18360 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
18370 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
18380 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
18390 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
183a0 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a  ber(DbPage *p){.
183b0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
183c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
183d0 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29  * The page_ref()
183e0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d   function increm
183f0 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  ents the referen
18400 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
18410 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70  age..** If the p
18420 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
18430 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
18440 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
18450 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
18460 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
18470 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
18480 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  st..**.** For no
18490 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  n-test systems, 
184a0 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20  page_ref() is a 
184b0 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73  macro that calls
184c0 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20   _page_ref().** 
184d0 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  online of the re
184e0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
184f0 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74   zero.  For test
18500 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
18510 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61  ef().** is a rea
18520 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68  l function so th
18530 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72  at we can set br
18540 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72  eakpoints and tr
18550 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ace it..*/.stati
18560 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
18570 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
18580 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
18590 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
185a0 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
185b0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
185c0 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
185d0 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f  .    lruListRemo
185e0 76 65 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  ve(pPg);.    pPg
185f0 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b  ->pPager->nRef++
18600 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65  ;.  }.  pPg->nRe
18610 66 2b 2b 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  f++;.}.#ifdef SQ
18620 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61  LITE_DEBUG.  sta
18630 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
18640 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
18650 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
18660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61  ==0 ){.      _pa
18670 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20  ge_ref(pPg);.   
18680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
18690 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  g->nRef++;.    }
186a0 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
186b0 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
186c0 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
186d0 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
186e0 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
186f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
18700 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
18710 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
18720 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
18730 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
18740 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
18750 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
18760 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
18770 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
18780 67 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  g){.  pagerEnter
18790 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pPg->pPager);. 
187a0 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
187b0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67    pagerLeave(pPg
187c0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  ->pPager);.  ret
187d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
187e0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
187f0 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
18800 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
18810 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
18820 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
18830 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
18840 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
18850 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
18860 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
18870 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
18880 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
18890 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
188a0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
188b0 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
188c0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
188d0 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
188e0 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
188f0 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
18900 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
18910 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
18920 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
18930 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
18940 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
18950 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
18960 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
18970 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
18980 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
18990 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
189a0 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
189b0 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
189c0 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
189d0 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
189e0 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
189f0 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
18a00 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
18a10 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
18a20 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
18a30 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
18a40 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
18a50 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
18a60 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
18a70 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
18a80 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
18a90 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
18aa0 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
18ab0 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
18ac0 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
18ad0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
18ae0 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
18af0 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
18b00 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
18b10 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
18b20 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
18b30 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
18b40 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
18b50 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
18b60 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73  failure, so no s
18b70 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
18b80 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  * If the IOCAP_S
18b90 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69  EQUENTIAL flag i
18ba0 73 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65  s set for the pe
18bb0 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f  rsistent media o
18bc0 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64  n which.** the d
18bd0 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65  atabase is store
18be0 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29  d, then OsSync()
18bf0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
18c00 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   on the journal.
18c10 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  ** file. In this
18c20 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69   case all that i
18c30 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f  s required is to
18c40 20 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63   update the nRec
18c50 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65   field in.** the
18c60 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
18c70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18c80 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
18c90 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
18ca0 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
18cb0 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
18cc0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
18cd0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
18ce0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
18cf0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
18d00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18d10 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79 6e 63  _OK;...  /* Sync
18d20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
18d30 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
18d40 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
18d50 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
18d60 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
18d70 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
18d80 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
18d90 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
18da0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
18db0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
18dc0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
18dd0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
18de0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
18df0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
18e00 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
18e10 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
18e20 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
18e30 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
18e40 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
18e50 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
18e60 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
18e70 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
18e80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
18e90 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
18ea0 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
18eb0 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
18ec0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
18ed0 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
18ee0 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
18ef0 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
18f00 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
18f10 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
18f20 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
18f30 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
18f40 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
18f50 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
18f60 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
18f70 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
18f80 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
18f90 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
18fa0 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
18fb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
18fc0 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
18fd0 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
18fe0 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
18ff0 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
19000 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
19010 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
19020 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
19030 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
19040 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
19050 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
19060 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
19070 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
19080 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
19090 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
190a0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
190b0 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
190c0 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 72  /.        i64 jr
190d0 6e 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69  nlOff;.        i
190e0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
190f0 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
19100 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
19110 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
19120 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
19130 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
19140 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
19150 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
19160 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
19170 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
19180 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
19190 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
191a0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
191b0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
191c0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
191d0 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
191e0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
191f0 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20          jrnlOff 
19200 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
19210 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
19220 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20  ournalMagic);.  
19230 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
19240 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
19250 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c  n", pPager, jrnl
19260 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20  Off, 4));.      
19270 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
19280 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
19290 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  jrnlOff, pPager-
192a0 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
192b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
192c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
192d0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
192e0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
192f0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
19300 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
19310 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
19320 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
19330 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
19340 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
19350 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
19360 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
19370 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
19380 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
19390 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20  sync_flags| .   
193a0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
193b0 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49  sync_flags==SQLI
193c0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
193d0 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
193e0 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
193f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
19400 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
19410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
19420 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
19430 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
19440 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
19450 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
19460 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
19470 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
19480 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
19490 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
194a0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
194b0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
194c0 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  l){.      pPg->n
194d0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
194e0 20 7d 0a 20 20 20 20 6c 72 75 4c 69 73 74 53 65   }.    lruListSe
194f0 74 46 69 72 73 74 53 79 6e 63 65 64 28 70 50 61  tFirstSynced(pPa
19500 67 65 72 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  ger);.  }..#ifnd
19510 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
19520 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
19530 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
19540 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
19550 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
19560 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
19570 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
19580 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
19590 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
195a0 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
195b0 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
195c0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
195d0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
195e0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
195f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19600 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
19610 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
19620 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6c 72 75  ert( pPager->lru
19630 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70  .pFirstSynced==p
19640 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
19650 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t );.  }.#endif.
19660 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19670 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f  ./*.** Merge two
19680 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73 20   lists of pages 
19690 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
196a0 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20  rty and in pgno 
196b0 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  order..** Do not
196c0 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65   both fixing the
196d0 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
196e0 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
196f0 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67  PgHdr *merge_pag
19700 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c  elist(PgHdr *pA,
19710 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50   PgHdr *pB){.  P
19720 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54  gHdr result, *pT
19730 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26  ail;.  pTail = &
19740 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28  result;.  while(
19750 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20   pA && pB ){.   
19760 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42   if( pA->pgno<pB
19770 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
19780 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
19790 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20  pA;.      pTail 
197a0 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d  = pA;.      pA =
197b0 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   pA->pDirty;.   
197c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
197d0 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42  ail->pDirty = pB
197e0 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
197f0 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70  pB;.      pB = p
19800 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  B->pDirty;.    }
19810 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b  .  }.  if( pA ){
19820 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
19830 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65  ty = pA;.  }else
19840 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70   if( pB ){.    p
19850 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
19860 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  B;.  }else{.    
19870 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
19880 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
19890 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d  result.pDirty;.}
198a0 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65  ../*.** Sort the
198b0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   list of pages i
198c0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
198d0 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65  r by pgno.  Page
198e0 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  s are.** connect
198f0 65 64 20 62 79 20 70 44 69 72 74 79 20 70 6f 69  ed by pDirty poi
19900 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50 72 65  nters.  The pPre
19910 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20  vDirty pointers 
19920 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64  are.** corrupted
19930 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a   by this sort..*
19940 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54  /.#define N_SORT
19950 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35  _BUCKET_ALLOC 25
19960 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f  .#define N_SORT_
19970 42 55 43 4b 45 54 20 20 20 20 20 20 20 32 35 0a  BUCKET       25.
19980 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
19990 53 54 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33  ST.  int sqlite3
199a0 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75  _pager_n_sort_bu
199b0 63 6b 65 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64  cket = 0;.  #und
199c0 65 66 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  ef N_SORT_BUCKET
199d0 0a 20 20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52  .  #define N_SOR
199e0 54 5f 42 55 43 4b 45 54 20 5c 0a 20 20 20 28 73  T_BUCKET \.   (s
199f0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73  qlite3_pager_n_s
19a00 6f 72 74 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74  ort_bucket?sqlit
19a10 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
19a20 62 75 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55  bucket:N_SORT_BU
19a30 43 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64  CKET_ALLOC).#end
19a40 69 66 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  if.static PgHdr 
19a50 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 50  *sort_pagelist(P
19a60 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67  gHdr *pIn){.  Pg
19a70 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55  Hdr *a[N_SORT_BU
19a80 43 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b  CKET_ALLOC], *p;
19a90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73  .  int i;.  mems
19aa0 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(a, 0, sizeof(
19ab0 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  a));.  while( pI
19ac0 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e  n ){.    p = pIn
19ad0 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70  ;.    pIn = p->p
19ae0 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
19af0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f  irty = 0;.    fo
19b00 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f  r(i=0; i<N_SORT_
19b10 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a  BUCKET-1; i++){.
19b20 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d        if( a[i]==
19b30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69  0 ){.        a[i
19b40 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62  ] = p;.        b
19b50 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
19b60 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d  e{.        p = m
19b70 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b  erge_pagelist(a[
19b80 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  i], p);.        
19b90 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  a[i] = 0;.      
19ba0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
19bb0 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  i==N_SORT_BUCKET
19bc0 2d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  -1 ){.      /* C
19bd0 6f 76 65 72 61 67 65 3a 20 54 6f 20 67 65 74 20  overage: To get 
19be0 68 65 72 65 2c 20 74 68 65 72 65 20 6e 65 65 64  here, there need
19bf0 20 74 6f 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54   to be 2^(N_SORT
19c00 5f 42 55 43 4b 45 54 29 20 0a 20 20 20 20 20 20  _BUCKET) .      
19c10 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  ** elements in t
19c20 68 65 20 69 6e 70 75 74 20 6c 69 73 74 2e 20 54  he input list. T
19c30 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c  his is possible,
19c40 20 62 75 74 20 69 6d 70 72 61 63 74 69 63 61 6c   but impractical
19c50 2e 0a 20 20 20 20 20 20 2a 2a 20 54 65 73 74 69  ..      ** Testi
19c60 6e 67 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20  ng this line is 
19c70 74 68 65 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f  the point of glo
19c80 62 61 6c 20 76 61 72 69 61 62 6c 65 0a 20 20 20  bal variable.   
19c90 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61     ** sqlite3_pa
19ca0 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
19cb0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
19cc0 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70    a[i] = merge_p
19cd0 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29  agelist(a[i], p)
19ce0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20  ;.    }.  }.  p 
19cf0 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  = a[0];.  for(i=
19d00 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b  1; i<N_SORT_BUCK
19d10 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  ET; i++){.    p 
19d20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
19d30 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20  (p, a[i]);.  }. 
19d40 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
19d50 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74  .** Given a list
19d60 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65   of pages (conne
19d70 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64  cted by the PgHd
19d80 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
19d90 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79  ) write.** every
19da0 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
19db0 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ges out to the d
19dc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
19dd0 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a   mark them all.*
19de0 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73  * as clean..*/.s
19df0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
19e00 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
19e10 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
19e20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
19e30 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74   PgHdr *p;.  int
19e40 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
19e50 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
19e60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
19e70 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
19e80 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
19e90 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
19ea0 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
19eb0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
19ec0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
19ed0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
19ee0 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
19ef0 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
19f00 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
19f10 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
19f20 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
19f30 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
19f40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
19f50 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
19f60 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
19f70 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
19f80 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
19f90 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
19fa0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
19fb0 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
19fc0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
19fd0 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
19fe0 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
19ff0 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
1a000 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
1a010 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
1a020 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
1a030 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
1a040 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
1a050 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
1a060 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
1a070 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
1a080 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
1a090 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
1a0a0 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
1a0b0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
1a0c0 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
1a0d0 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
1a0e0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
1a0f0 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
1a100 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
1a110 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
1a120 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
1a130 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
1a140 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
1a150 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
1a160 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
1a170 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
1a180 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
1a190 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
1a1a0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
1a1b0 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
1a1c0 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
1a1d0 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
1a1e0 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
1a1f0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
1a200 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
1a210 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
1a220 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
1a230 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a240 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1a250 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73    }..  pList = s
1a260 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69  ort_pagelist(pLi
1a270 73 74 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69  st);.  for(p=pLi
1a280 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
1a290 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ty){.    assert(
1a2a0 20 70 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20   p->dirty );.   
1a2b0 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20   p->dirty = 0;. 
1a2c0 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73   }.  while( pLis
1a2d0 74 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  t ){..    /* If 
1a2e0 74 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  the file has not
1a2f0 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
1a300 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a  , open it now. *
1a310 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
1a320 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
1a330 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1a340 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a350 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
1a360 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
1a370 6d 70 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  mp(pPager->pVfs,
1a380 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61   pPager->fd, pPa
1a390 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger->zFilename,.
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3c0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
1a3d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1a3e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1a3f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1a400 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
1a410 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
1a420 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
1a430 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
1a440 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
1a450 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
1a460 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
1a470 72 54 72 75 6e 63 61 74 65 28 29 20 77 61 73 20  rTruncate() was 
1a480 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
1a490 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
1a4a0 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
1a4b0 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
1a4c0 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
1a4d0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
1a4e0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
1a4f0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  he file..    */.
1a500 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
1a510 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
1a520 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 36 34  ize ){.      i64
1a530 20 6f 66 66 73 65 74 20 3d 20 28 70 4c 69 73 74   offset = (pList
1a540 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70  ->pgno-1)*(i64)p
1a550 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1a560 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
1a570 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  ta = CODEC2(pPag
1a580 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
1a590 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d  A(pList), pList-
1a5a0 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20  >pgno, 6);.     
1a5b0 20 50 41 47 45 52 54 52 41 43 45 34 28 22 53 54   PAGERTRACE4("ST
1a5c0 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
1a5d0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1a600 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70  , pList->pgno, p
1a610 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
1a620 69 73 74 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ist));.      IOT
1a630 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
1a640 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1a650 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  List->pgno));.  
1a660 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a670 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1a680 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
1a690 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
1a6a0 73 65 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  set);.      PAGE
1a6b0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1a6c0 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
1a6d0 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  nt);.      PAGER
1a6e0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57  _INCR(pPager->nW
1a6f0 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  rite);.      if(
1a700 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pList->pgno==1 
1a710 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
1a720 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
1a730 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
1a740 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
1a750 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1a760 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
1a770 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1a780 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47   else{.      PAG
1a790 45 52 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52  ERTRACE3("NOSTOR
1a7a0 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
1a7b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1a7c0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
1a7d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1a7e0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1a7f0 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
1a800 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1a810 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61     pList->pageHa
1a820 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1a830 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64  ash(pList);.#end
1a840 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  if.    pList = p
1a850 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
1a860 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1a870 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
1a880 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72  ollect every dir
1a890 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64  ty page into a d
1a8a0 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  irty list and.**
1a8b0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
1a8c0 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
1a8d0 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c   that list.  All
1a8e0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   pages are.** co
1a8f0 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20  llected even if 
1a900 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69  they are still i
1a910 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
1a920 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65   PgHdr *pager_ge
1a930 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
1a940 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
1a950 7b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  {..#ifndef NDEBU
1a960 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
1a970 65 20 73 61 6e 69 74 79 20 6f 66 20 74 68 65 20  e sanity of the 
1a980 64 69 72 74 79 20 6c 69 73 74 20 77 68 65 6e 20  dirty list when 
1a990 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 0a 20  we are running. 
1a9a0 20 2a 2a 20 69 6e 20 64 65 62 75 67 67 69 6e 67   ** in debugging
1a9b0 20 6d 6f 64 65 2e 20 20 54 68 69 73 20 69 73 20   mode.  This is 
1a9c0 65 78 70 65 6e 73 69 76 65 2c 20 73 6f 20 64 6f  expensive, so do
1a9d0 20 6e 6f 74 0a 20 20 2a 2a 20 64 6f 20 74 68 69   not.  ** do thi
1a9e0 73 20 6f 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75  s on a normal bu
1a9f0 69 6c 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 31  ild. */.  int n1
1aa00 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 32 20 3d   = 0;.  int n2 =
1aa10 20 30 3b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a   0;.  PgHdr *p;.
1aa20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
1aa30 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  pAll; p; p=p->pN
1aa40 65 78 74 41 6c 6c 29 7b 20 69 66 28 20 70 2d 3e  extAll){ if( p->
1aa50 64 69 72 74 79 20 29 20 6e 31 2b 2b 3b 20 7d 0a  dirty ) n1++; }.
1aa60 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
1aa70 70 44 69 72 74 79 3b 20 70 3b 20 70 3d 70 2d 3e  pDirty; p; p=p->
1aa80 70 44 69 72 74 79 29 7b 20 6e 32 2b 2b 3b 20 7d  pDirty){ n2++; }
1aa90 0a 20 20 61 73 73 65 72 74 28 20 6e 31 3d 3d 6e  .  assert( n1==n
1aaa0 32 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72  2 );.#endif..  r
1aab0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44  eturn pPager->pD
1aac0 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  irty;.}../*.** R
1aad0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65  eturn 1 if there
1aae0 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
1aaf0 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  l on the given p
1ab00 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a  ager..** A hot j
1ab10 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
1ab20 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  at needs to be p
1ab30 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  layed back..**.*
1ab40 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
1ab50 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1ab60 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
1ab70 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
1ab80 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
1ab90 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
1aba0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
1abb0 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
1abc0 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
1abd0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
1abe0 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74  ame.  Just delet
1abf0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
1ac00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61  *.** Return nega
1ac10 74 69 76 65 20 69 66 20 75 6e 61 62 6c 65 20 74  tive if unable t
1ac20 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1ac30 73 74 61 74 75 73 20 6f 66 20 74 68 65 20 6a 6f  status of the jo
1ac40 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urnal..**.** Thi
1ac50 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
1ac60 6f 74 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ot open the jour
1ac70 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 78 61 6d  nal file to exam
1ac80 69 6e 65 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65  ine its.** conte
1ac90 6e 74 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  nt.  Hence, the 
1aca0 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
1acb0 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f  ntain the name o
1acc0 66 20 61 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  f a master.** jo
1acd0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
1ace0 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64  has been deleted
1acf0 2c 20 61 6e 64 20 68 65 6e 63 65 20 6e 6f 74 20  , and hence not 
1ad00 62 65 20 68 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74  be hot.  Or.** t
1ad10 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
1ad20 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 62   journal might b
1ad30 65 20 7a 65 72 6f 65 64 20 6f 75 74 2e 20 20 54  e zeroed out.  T
1ad40 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64  his routine.** d
1ad50 6f 65 73 20 6e 6f 74 20 64 69 73 63 6f 76 65 72  oes not discover
1ad60 20 74 68 65 73 65 20 63 61 73 65 73 20 6f 66 20   these cases of 
1ad70 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61  a non-hot journa
1ad80 6c 20 2d 20 69 66 20 74 68 65 0a 2a 2a 20 6a 6f  l - if the.** jo
1ad90 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
1ada0 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 65 6d 70  s and is not emp
1adb0 74 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ty this routine 
1adc0 61 73 73 75 6d 65 73 20 69 74 0a 2a 2a 20 69 73  assumes it.** is
1add0 20 68 6f 74 2e 20 20 54 68 65 20 70 61 67 65 72   hot.  The pager
1ade0 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
1adf0 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
1ae00 72 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 6a 6f  r that the.** jo
1ae10 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
1ae20 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64  t really hot and
1ae30 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   will no-op..*/.
1ae40 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
1ae50 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
1ae60 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
1ae70 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1ae80 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
1ae90 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 21 70 50  nt rc;.  if( !pP
1aea0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1aeb0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1aec0 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e  f( !pPager->fd->
1aed0 70 4d 65 74 68 6f 64 73 20 29 20 72 65 74 75 72  pMethods ) retur
1aee0 6e 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n 0;.  rc = sqli
1aef0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1af00 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1af10 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
1af20 53 5f 45 58 49 53 54 53 29 3b 0a 20 20 69 66 28  S_EXISTS);.  if(
1af30 20 72 63 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65   rc<=0 ){.    re
1af40 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
1af50 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  f( sqlite3OsChec
1af60 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
1af70 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1af80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1af90 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
1afa0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1afb0 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  r)==0 ){.    sql
1afc0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
1afd0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
1afe0 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  nal, 0);.    ret
1aff0 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
1b000 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1b010 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  }.}../*.** Try t
1b020 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
1b030 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
1b040 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e  can be recycled.
1b050 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
1b060 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20  tine may return 
1b070 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
1b080 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c  LITE_FULL or SQL
1b090 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64  ITE_OK. It .** d
1b0a0 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20  oes not set the 
1b0b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1b0c0 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1b0d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65  tic int pager_re
1b0e0 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61  cycle(Pager *pPa
1b0f0 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  ger, PgHdr **ppP
1b100 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
1b110 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
1b120 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67    /* It is illeg
1b130 61 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  al to call this 
1b140 66 75 6e 63 74 69 6f 6e 20 75 6e 6c 65 73 73 20  function unless 
1b150 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
1b160 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  .  ** pointed to
1b170 20 62 79 20 70 50 61 67 65 72 20 68 61 73 20 61   by pPager has a
1b180 74 20 6c 65 61 73 74 20 6f 6e 65 20 66 72 65 65  t least one free
1b190 20 70 61 67 65 20 28 70 61 67 65 20 77 69 74 68   page (page with
1b1a0 20 6e 52 65 66 3d 3d 30 29 2e 0a 20 20 2a 2f 20   nRef==0)..  */ 
1b1b0 0a 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42  .  assert(!MEMDB
1b1c0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  );.  assert(pPag
1b1d0 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b  er->lru.pFirst);
1b1e0 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61  ..  /* Find a pa
1b1f0 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20  ge to recycle.  
1b200 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  Try to locate a 
1b210 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
1b220 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20  ot.  ** require 
1b230 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e  us to do an fsyn
1b240 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  c() on the journ
1b250 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  al..  */.  pPg =
1b260 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
1b270 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a  rstSynced;..  /*
1b280 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74   If we could not
1b290 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61   find a page tha
1b2a0 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
1b2b0 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20  re an fsync().  
1b2c0 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ** on the journa
1b2d0 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e  l file then fsyn
1b2e0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
1b2f0 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20  le.  This is a. 
1b300 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70   ** very slow op
1b310 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77  eration, so we w
1b320 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69  ork hard to avoi
1b330 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74  d it.  But somet
1b340 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e  imes.  ** it can
1b350 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20  't be helped..  
1b360 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  */.  if( pPg==0 
1b370 26 26 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  && pPager->lru.p
1b380 46 69 72 73 74 29 7b 0a 20 20 20 20 69 6e 74 20  First){.    int 
1b390 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
1b3a0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1b3b0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1b3c0 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  ;.    int rc = s
1b3d0 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
1b3e0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1b3f0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1b400 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1b410 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
1b420 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
1b430 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1b440 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
1b450 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c     /* If in full
1b460 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74  -sync mode, writ
1b470 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  e a new journal 
1b480 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a  header into the.
1b490 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
1b4a0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64   file. This is d
1b4b0 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65  one to avoid eve
1b4c0 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f  r modifying a jo
1b4d0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68  urnal.      ** h
1b4e0 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e  eader that is in
1b4f0 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f  volved in the ro
1b500 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20  llback of pages 
1b510 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20  that have.      
1b520 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
1b530 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
1b540 61 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65  atabase (in case
1b550 20 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20   the header is. 
1b560 20 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20       ** trashed 
1b570 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  when the nRec fi
1b580 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e  eld is updated).
1b590 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1b5a0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
1b5b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b5c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b5d0 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20  ff > 0 );.      
1b5e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b5f0 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a  doNotSync==0 );.
1b600 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1b610 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1b620 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1b630 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1b640 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b650 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20  }.    }.    pPg 
1b660 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  = pPager->lru.pF
1b670 69 72 73 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  irst;.  }..  ass
1b680 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
1b690 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  0 );..  /* Write
1b6a0 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
1b6b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1b6c0 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20  f it is dirty.. 
1b6d0 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64   */.  if( pPg->d
1b6e0 69 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  irty ){.    int 
1b6f0 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
1b700 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
1b710 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61   );.    makeClea
1b720 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d  n(pPg);.    pPg-
1b730 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20  >dirty = 1;.    
1b740 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
1b750 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1b760 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20  write_pagelist( 
1b770 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
1b780 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69  dirty = 0;.    i
1b790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b7a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b7b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
1b7c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
1b7d0 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  rty==0 );..  /* 
1b7e0 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61  If the page we a
1b7f0 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20  re recycling is 
1b800 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
1b810 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20  Rollback, then. 
1b820 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
1b830 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
1b840 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
1b850 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  abling the.  ** 
1b860 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1b870 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  Rollback() optim
1b880 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
1b890 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
1b8a0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  nsaction..  ** I
1b8b0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
1b8c0 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
1b8d0 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
1b8e0 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
1b8f0 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72  .  ** might be r
1b900 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74  eloaded at a lat
1b910 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74  er time but at t
1b920 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e  hat point we won
1b930 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  't remember.  **
1b940 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72   that is was mar
1b950 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
1b960 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ck.  This means 
1b970 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d  that all pages m
1b980 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b  ust.  ** be mark
1b990 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
1b9a0 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
1b9b0 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  n out..  */.  if
1b9c0 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
1b9d0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54  lback ){.    IOT
1b9e0 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f  RACE(("ALWAYS_RO
1b9f0 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50  LLBACK %p\n", pP
1ba00 61 67 65 72 29 29 0a 20 20 20 20 70 50 61 67 65  ager)).    pPage
1ba10 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
1ba20 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 1;.  }..  /*
1ba30 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20   Unlink the old 
1ba40 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
1ba50 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20  ee list and the 
1ba60 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  hash table.  */.
1ba70 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
1ba80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
1ba90 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20  ->pgno==0 );..  
1baa0 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72  *ppPg = pPg;.  r
1bab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bac0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1bad0 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
1bae0 4d 41 4e 41 47 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a  MANAGEMENT./*.**
1baf0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1bb00 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65  s called to free
1bb10 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e   superfluous dyn
1bb20 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
1bb30 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c  ed memory.** hel
1bb40 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 73  d by the pager s
1bb50 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e  ystem. Memory in
1bb60 20 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69   use by any SQLi
1bb70 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74  te pager allocat
1bb80 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72  ed.** by the cur
1bb90 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20  rent thread may 
1bba0 62 65 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  be sqlite3_free(
1bbb0 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20  )ed..**.** nReq 
1bbc0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1bbd0 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
1bbe0 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20   required. Once 
1bbf0 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a  this much has.**
1bc00 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20   been released, 
1bc10 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
1bc20 75 72 6e 73 2e 20 54 68 65 20 72 65 74 75 72 6e  urns. The return
1bc30 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f   value is the to
1bc40 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f  tal number .** o
1bc50 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  f bytes of memor
1bc60 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 69  y released..*/.i
1bc70 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
1bc80 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74  eleaseMemory(int
1bc90 20 6e 52 65 71 29 7b 0a 20 20 69 6e 74 20 6e 52   nReq){.  int nR
1bca0 65 6c 65 61 73 65 64 20 3d 20 30 3b 20 20 20 20  eleased = 0;    
1bcb0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1bcc0 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65  f memory release
1bcd0 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 50 61  d so far */.  Pa
1bce0 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20  ger *pPager;    
1bcf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1bd00 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61   looping over pa
1bd10 67 65 72 73 20 2a 2f 0a 20 20 42 75 73 79 48 61  gers */.  BusyHa
1bd20 6e 64 6c 65 72 20 2a 73 61 76 65 64 42 75 73 79  ndler *savedBusy
1bd30 3b 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 63  ;     /* Saved c
1bd40 6f 70 79 20 6f 66 20 74 68 65 20 62 75 73 79 20  opy of the busy 
1bd50 68 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74  handler */.  int
1bd60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bd70 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74  ..  /* Acquire t
1bd80 68 65 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65  he memory-manage
1bd90 6d 65 6e 74 20 6d 75 74 65 78 0a 20 20 2a 2f 0a  ment mutex.  */.
1bda0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d  #ifndef SQLITE_M
1bdb0 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 73 71 6c 69  UTEX_NOOP.  sqli
1bdc0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
1bdd0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4d  ;       /* The M
1bde0 45 4d 32 20 6d 75 74 65 78 20 2a 2f 0a 20 20 6d  EM2 mutex */.  m
1bdf0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
1be00 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1be10 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
1be20 45 4d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  EM2);.#endif.  s
1be30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1be40 65 72 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  er(mutex);..  /*
1be50 20 53 69 67 6e 61 6c 20 61 6c 6c 20 64 61 74 61   Signal all data
1be60 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
1be70 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 6d 61 6e   that memory man
1be80 61 67 65 6d 65 6e 74 20 77 61 6e 74 73 0a 20 20  agement wants.  
1be90 2a 2a 20 74 6f 20 68 61 76 65 20 61 63 63 65 73  ** to have acces
1bea0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 73 2e  s to the pagers.
1beb0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67  .  */.  for(pPag
1bec0 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c  er=sqlite3PagerL
1bed0 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61  ist; pPager; pPa
1bee0 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78  ger=pPager->pNex
1bef0 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d  t){.     pPager-
1bf00 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 31 3b 0a 20  >iInUseMM = 1;. 
1bf10 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
1bf20 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6e  =SQLITE_OK && (n
1bf30 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73  Req<0 || nReleas
1bf40 65 64 3c 6e 52 65 71 29 20 29 7b 0a 20 20 20 20  ed<nReq) ){.    
1bf50 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
1bf60 50 67 48 64 72 20 2a 70 52 65 63 79 63 6c 65 64  PgHdr *pRecycled
1bf70 3b 0a 20 0a 20 20 20 20 2f 2a 20 54 72 79 20 74  ;. .    /* Try t
1bf80 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f  o find a page to
1bf90 20 72 65 63 79 63 6c 65 20 74 68 61 74 20 64 6f   recycle that do
1bfa0 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
1bfb0 20 73 79 6e 63 28 29 2e 20 49 66 0a 20 20 20 20   sync(). If.    
1bfc0 2a 2a 20 74 68 69 73 20 69 73 20 6e 6f 74 20 70  ** this is not p
1bfd0 6f 73 73 69 62 6c 65 2c 20 66 69 6e 64 20 6f 6e  ossible, find on
1bfe0 65 20 74 68 61 74 20 64 6f 65 73 20 72 65 71 75  e that does requ
1bff0 69 72 65 20 61 20 73 79 6e 63 28 29 2e 0a 20 20  ire a sync()..  
1c000 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1c010 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
1c020 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
1c030 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1c040 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20  ATIC_LRU));.    
1c050 70 50 67 20 3d 20 73 71 6c 69 74 65 33 4c 72 75  pPg = sqlite3Lru
1c060 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53  PageList.pFirstS
1c070 79 6e 63 65 64 3b 0a 20 20 20 20 77 68 69 6c 65  ynced;.    while
1c080 28 20 70 50 67 20 26 26 20 28 70 50 67 2d 3e 6e  ( pPg && (pPg->n
1c090 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 2d 3e  eedSync || pPg->
1c0a0 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42  pPager->iInUseDB
1c0b0 29 20 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d  ) ){.      pPg =
1c0c0 20 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78   pPg->gfree.pNex
1c0d0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
1c0e0 20 21 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70   !pPg ){.      p
1c0f0 50 67 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50  Pg = sqlite3LruP
1c100 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 3b 0a  ageList.pFirst;.
1c110 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 67        while( pPg
1c120 20 26 26 20 70 50 67 2d 3e 70 50 61 67 65 72 2d   && pPg->pPager-
1c130 3e 69 49 6e 55 73 65 44 42 20 29 7b 0a 20 20 20  >iInUseDB ){.   
1c140 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
1c150 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20  gfree.pNext;.   
1c160 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1c170 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1c180 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ve(sqlite3_mutex
1c190 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
1c1a0 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29  TEX_STATIC_LRU))
1c1b0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 67  ;..    /* If pPg
1c1c0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 62 6c  ==0, then the bl
1c1d0 6f 63 6b 20 61 62 6f 76 65 20 68 61 73 20 66 61  ock above has fa
1c1e0 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70  iled to find a p
1c1f0 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65  age to.    ** re
1c200 63 79 63 6c 65 2e 20 49 6e 20 74 68 69 73 20 63  cycle. In this c
1c210 61 73 65 20 72 65 74 75 72 6e 20 65 61 72 6c 79  ase return early
1c220 20 2d 20 6e 6f 20 66 75 72 74 68 65 72 20 6d 65   - no further me
1c230 6d 6f 72 79 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  mory will.    **
1c240 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20   be released..  
1c250 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
1c260 67 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  g ) break;..    
1c270 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1c280 61 67 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  ager;.    assert
1c290 28 21 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  (!pPg->needSync 
1c2a0 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  || pPg==pPager->
1c2b0 6c 72 75 2e 70 46 69 72 73 74 29 3b 0a 20 20 20  lru.pFirst);.   
1c2c0 20 61 73 73 65 72 74 28 70 50 67 2d 3e 6e 65 65   assert(pPg->nee
1c2d0 64 53 79 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50  dSync || pPg==pP
1c2e0 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
1c2f0 53 79 6e 63 65 64 29 3b 0a 20 20 0a 20 20 20 20  Synced);.  .    
1c300 73 61 76 65 64 42 75 73 79 20 3d 20 70 50 61 67  savedBusy = pPag
1c310 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
1c320 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42  ;.    pPager->pB
1c330 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 0a  usyHandler = 0;.
1c340 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72      rc = pager_r
1c350 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 26  ecycle(pPager, &
1c360 70 52 65 63 79 63 6c 65 64 29 3b 0a 20 20 20 20  pRecycled);.    
1c370 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
1c380 64 6c 65 72 20 3d 20 73 61 76 65 64 42 75 73 79  dler = savedBusy
1c390 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 52 65  ;.    assert(pRe
1c3a0 63 79 63 6c 65 64 3d 3d 70 50 67 20 7c 7c 20 72  cycled==pPg || r
1c3b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  c!=SQLITE_OK);. 
1c3c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c3d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
1c3e0 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70   We've found a p
1c3f0 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20  age to free. At 
1c400 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
1c410 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20  age has been .  
1c420 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66      ** removed f
1c430 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61 73  rom the page has
1c440 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69  h-table, free-li
1c450 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69  st and synced-li
1c460 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 28 70 46  st .      ** (pF
1c470 69 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20  irstSynced). It 
1c480 69 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20  is still in the 
1c490 61 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29  all pages (pAll)
1c4a0 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 2a 2a   list. .      **
1c4b0 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   Remove it from 
1c4c0 74 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65  this list before
1c4d0 20 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20   freeing..      
1c4e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f  **.      ** Todo
1c4f0 3a 20 43 68 65 63 6b 20 74 68 65 20 50 61 67 65  : Check the Page
1c500 72 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20  r.pStmt list to 
1c510 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69  make sure this i
1c520 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20  s Ok. It .      
1c530 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74  ** probably is t
1c540 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a  hough..      */.
1c550 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d        PgHdr *pTm
1c560 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
1c570 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 69 66   pPg );.      if
1c580 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70  ( pPg==pPager->p
1c590 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  All ){.         
1c5a0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70  pPager->pAll = p
1c5b0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
1c5c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c5d0 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 50 61     for( pTmp=pPa
1c5e0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d  ger->pAll; pTmp-
1c5f0 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20  >pNextAll!=pPg; 
1c600 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74  pTmp=pTmp->pNext
1c610 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20  All ){}.        
1c620 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d  pTmp->pNextAll =
1c630 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
1c640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52        }.      nR
1c650 65 6c 65 61 73 65 64 20 2b 3d 20 28 0a 20 20 20  eleased += (.   
1c660 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
1c670 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  Pg) + pPager->pa
1c680 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20  geSize.         
1c690 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b   + sizeof(u32) +
1c6a0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a   pPager->nExtra.
1c6b0 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44            + MEMD
1c6c0 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  B*sizeof(PgHisto
1c6d0 72 79 29 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  ry) .      );.  
1c6e0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
1c6f0 46 52 45 45 20 25 70 20 25 64 20 2a 5c 6e 22 2c  FREE %p %d *\n",
1c700 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
1c710 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
1c720 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1c730 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
1c740 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1c750 33 5f 66 72 65 65 28 70 50 67 2d 3e 70 44 61 74  3_free(pPg->pDat
1c760 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
1c770 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20  3_free(pPg);.   
1c780 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
1c790 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  --;.    }else{. 
1c7a0 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72       /* An error
1c7b0 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20   occured whilst 
1c7c0 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
1c7d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20  atabase file or 
1c7e0 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
1c7f0 6c 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63  l in pager_recyc
1c800 6c 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20  le(). The error 
1c810 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20  is not returned 
1c820 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  to the .      **
1c830 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20   caller of this 
1c840 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  function. Instea
1c850 64 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  d, set the Pager
1c860 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c  .errCode variabl
1c870 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  e..      ** The 
1c880 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65  error will be re
1c890 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
1c8a0 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e  er (or users, in
1c8b0 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20   the case .     
1c8c0 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20   ** of a shared 
1c8d0 70 61 67 65 72 20 63 61 63 68 65 29 20 6f 66 20  pager cache) of 
1c8e0 74 68 65 20 70 61 67 65 72 20 66 6f 72 20 77 68  the pager for wh
1c8f0 69 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63  ich the error oc
1c900 63 75 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  cured..      */.
1c910 20 20 20 20 20 20 61 73 73 65 72 74 28 0a 20 20        assert(.  
1c920 20 20 20 20 20 20 20 20 28 72 63 26 30 78 66 66          (rc&0xff
1c930 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  )==SQLITE_IOERR 
1c940 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d  ||.          rc=
1c950 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
1c960 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
1c970 4c 49 54 45 5f 42 55 53 59 0a 20 20 20 20 20 20  LITE_BUSY.      
1c980 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c990 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1c9a0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1c9b0 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  ;.      pager_er
1c9c0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1c9d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1c9e0 20 43 6c 65 61 72 20 74 68 65 20 6d 65 6d 6f 72   Clear the memor
1c9f0 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 66 6c 61  y management fla
1ca00 67 73 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  gs and release t
1ca10 68 65 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20  he mutex.  */.  
1ca20 66 6f 72 28 70 50 61 67 65 72 3d 73 71 6c 69 74  for(pPager=sqlit
1ca30 65 33 50 61 67 65 72 4c 69 73 74 3b 20 70 50 61  e3PagerList; pPa
1ca40 67 65 72 3b 20 70 50 61 67 65 72 3d 70 50 61 67  ger; pPager=pPag
1ca50 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
1ca60 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d   pPager->iInUseM
1ca70 4d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  M = 0;.  }.  sql
1ca80 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1ca90 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52  (mutex);..  /* R
1caa0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1cab0 20 6f 66 20 62 79 74 65 73 20 72 65 6c 65 61 73   of bytes releas
1cac0 65 64 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ed.  */.  return
1cad0 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65   nReleased;.}.#e
1cae0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
1caf0 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
1cb00 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a  AGEMENT */../*.*
1cb10 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
1cb20 6e 74 20 6f 66 20 70 61 67 65 20 70 50 67 20 6f  nt of page pPg o
1cb30 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ut of the databa
1cb40 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  se file..*/.stat
1cb50 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1cb60 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1cb70 20 50 67 48 64 72 20 2a 70 50 67 2c 20 50 67 6e   PgHdr *pPg, Pgn
1cb80 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  o pgno){.  int r
1cb90 63 3b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b  c;.  i64 offset;
1cba0 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42  .  assert( MEMDB
1cbb0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1cbc0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1cbd0 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
1cbe0 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  mpFile);.  if( !
1cbf0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1cc00 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75  hods ){.    retu
1cc10 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1cc20 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
1cc30 20 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f    offset = (pgno
1cc40 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
1cc50 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20  >pageSize;.  rc 
1cc60 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1cc70 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
1cc80 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1cc90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1cca0 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47  , offset);.  PAG
1ccb0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1ccc0 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
1ccd0 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  nt);.  PAGER_INC
1cce0 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
1ccf0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47  ;.  IOTRACE(("PG
1cd00 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  IN %p %d\n", pPa
1cd10 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69  ger, pgno));.  i
1cd20 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
1cd30 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1cd40 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
1cd50 28 75 38 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  (u8*)PGHDR_TO_DA
1cd60 54 41 28 70 50 67 29 29 5b 32 34 5d 2c 0a 20 20  TA(pPg))[24],.  
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
1cda0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1cdb0 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43  eVers));.  }.  C
1cdc0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 50 47  ODEC1(pPager, PG
1cdd0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1cde0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
1cdf0 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22  .  PAGERTRACE4("
1ce00 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
1ce10 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1ce30 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1ce40 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72  pPg->pgno, pager
1ce50 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b  _pagehash(pPg));
1ce60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ce70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1ce80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1ce90 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68  to obtain the sh
1cea0 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72  ared lock requir
1ceb0 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74  ed before.** dat
1cec0 61 20 6d 61 79 20 62 65 20 72 65 61 64 20 66 72  a may be read fr
1ced0 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
1cee0 68 65 2e 20 49 66 20 74 68 65 20 73 68 61 72 65  he. If the share
1cef0 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61  d lock has alrea
1cf00 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69  dy.** been obtai
1cf10 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
1cf20 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1cf30 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79  *.** Immediately
1cf40 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
1cf50 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
1cf60 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20   (if required), 
1cf70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
1cf80 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f   checks for a ho
1cf90 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  t-journal file. 
1cfa0 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c  If one is found,
1cfb0 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f   an emergency ro
1cfc0 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72  llback.** is per
1cfd0 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65  formed immediate
1cfe0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
1cff0 74 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  t pagerSharedLoc
1d000 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
1d010 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1d020 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73  ITE_OK;.  int is
1d030 48 6f 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  Hot = 0;..  /* I
1d040 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  f this database 
1d050 69 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 65 78  is opened for ex
1d060 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 2c 20  clusive access, 
1d070 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
1d080 6e 67 20 0a 20 20 2a 2a 20 70 61 67 65 20 72 65  ng .  ** page re
1d090 66 65 72 65 6e 63 65 73 20 61 6e 64 20 69 73 20  ferences and is 
1d0a0 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74 61 74  in an error-stat
1d0b0 65 2c 20 6e 6f 77 20 69 73 20 74 68 65 20 63 68  e, now is the ch
1d0c0 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20  ance to clear.  
1d0d0 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69  ** the error. Di
1d0e0 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
1d0f0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
1d100 63 61 63 68 65 20 61 6e 64 20 74 72 65 61 74 20  cache and treat 
1d110 61 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e 20 6a 6f  any.  ** open jo
1d120 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 20 61 20  urnal file as a 
1d130 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  hot-journal..  *
1d140 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26  /.  if( !MEMDB &
1d150 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  & pPager->exclus
1d160 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
1d170 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 70 50  r->nRef==0 && pP
1d180 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1d190 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1d1a0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
1d1b0 20 20 20 20 20 20 69 73 48 6f 74 20 3d 20 31 3b        isHot = 1;
1d1c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
1d1d0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
1d1e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65  ITE_OK;.    page
1d1f0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1d200 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1d210 65 20 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c  e pager is still
1d220 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
1d230 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65  te, do not proce
1d240 65 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20  ed. The error . 
1d250 20 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62   ** state will b
1d260 65 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d  e cleared at som
1d270 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
1d280 75 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70  uture when all p
1d290 61 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65  age .  ** refere
1d2a0 6e 63 65 73 20 61 72 65 20 64 72 6f 70 70 65 64  nces are dropped
1d2b0 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 63   and the cache c
1d2c0 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 2e  an be discarded.
1d2d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
1d2e0 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
1d2f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
1d300 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
1d310 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
1d320 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
1d330 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1d340 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1d350 4b 20 7c 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20  K || isHot ){.  
1d360 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1d370 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
1d380 66 73 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  fs;.    if( !MEM
1d390 44 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  DB ){.      asse
1d3a0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  rt( pPager->nRef
1d3b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
1d3c0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64   !pPager->noRead
1d3d0 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  lock ){.        
1d3e0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
1d3f0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
1d400 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
1d410 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d420 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d430 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1d440 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1d450 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  R_UNLOCK );.    
1d460 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
1d470 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1d480 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
1d490 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d4a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
1d4b0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
1d4c0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
1d4d0 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
1d4e0 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
1d4f0 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
1d500 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
1d510 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
1d520 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
1d530 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
1d540 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
1d550 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
1d560 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
1d570 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
1d580 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1d590 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20   rc<0 ){.       
1d5a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1d5b0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
1d5c0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
1d5d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1d5e0 20 72 63 3d 3d 31 20 7c 7c 20 69 73 48 6f 74 20   rc==1 || isHot 
1d5f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ){.        /* Ge
1d600 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
1d610 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1d620 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
1d630 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
1d640 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
1d650 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
1d660 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
1d670 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
1d680 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
1d690 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1d6a0 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
1d6b0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
1d6c0 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
1d6d0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62          ** datab
1d6e0 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
1d6f0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
1d700 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
1d710 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
1d720 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
1d730 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
1d740 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
1d750 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
1d760 67 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  g it .        **
1d770 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   back..        *
1d780 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65  * .        ** Be
1d790 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
1d7a0 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
1d7b0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
1d7c0 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20  ested, the.     
1d7d0 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f     ** second pro
1d7e0 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f  cess will get to
1d7f0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
1d800 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
1d810 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f   to.        ** o
1d820 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
1d830 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1d840 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d850 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
1d860 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1d870 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56  ->state<EXCLUSIV
1d880 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
1d890 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d8a0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
1d8b0 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
1d8c0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  K);.          if
1d8d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d8e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1d8f0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
1d900 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
1d910 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
1d920 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  iled;.          
1d930 7d 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  }.          pPag
1d940 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1d950 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
1d960 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 20       }. .       
1d970 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
1d980 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
1d990 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73  ite access. This
1d9a0 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a   is because in .
1d9b0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75          ** exclu
1d9c0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
1d9d0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1d9e0 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
1d9f0 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20  t open and.     
1da00 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75     ** possibly u
1da10 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
1da20 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
1da30 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
1da40 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1da50 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c  OsTruncate() cal
1da60 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73  l used in exclus
1da70 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
1da80 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20  also requires.  
1da90 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f        ** a read/
1daa0 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  write file handl
1dab0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
1dac0 20 20 20 20 20 20 69 66 28 20 21 69 73 48 6f 74        if( !isHot
1dad0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
1dae0 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20  nalOpen==0 ){.  
1daf0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20          int res 
1db00 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
1db10 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a  s(pVfs,pPager->z
1db20 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41  Journal,SQLITE_A
1db30 43 43 45 53 53 5f 45 58 49 53 54 53 29 3b 0a 20  CCESS_EXISTS);. 
1db40 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73           if( res
1db50 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==1 ){.         
1db60 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
1db70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1db80 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
1db90 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
1dba0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1dbb0 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
1dbc0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1dbd0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1dbe0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1dbf0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
1dc00 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
1dc10 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
1dc20 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
1dc30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1dc40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1dc50 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  | pPager->jfd->p
1dc60 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20  Methods );.     
1dc70 20 20 20 20 20 20 20 69 66 28 20 66 6f 75 74 26         if( fout&
1dc80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1dc90 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
1dca0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1dcb0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1dcc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
1dcd0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
1dce0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
1dcf0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1dd00 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
1dd10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1dd20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65   the journal doe
1dd30 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 61  s not exist, tha
1dd40 74 20 6d 65 61 6e 73 20 73 6f 6d 65 20 6f 74 68  t means some oth
1dd50 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20  er process.     
1dd60 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c         ** has al
1dd70 72 65 61 64 79 20 72 6f 6c 6c 65 64 20 69 74 20  ready rolled it 
1dd80 62 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  back */.        
1dd90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1dda0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
1ddb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1ddc0 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33     /* If sqlite3
1ddd0 4f 73 41 63 63 65 73 73 28 29 20 72 65 74 75 72  OsAccess() retur
1dde0 6e 73 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  ns a negative va
1ddf0 6c 75 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  lue, that means 
1de00 69 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  it.            *
1de10 2a 20 66 61 69 6c 65 64 20 61 20 6d 65 6d 6f 72  * failed a memor
1de20 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  y allocation */.
1de30 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1de40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1de50 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  MEM;.          }
1de60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1de70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1de80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1de90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1dea0 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51  _NOMEM && rc!=SQ
1deb0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
1dec0 4b 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  K .           &&
1ded0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1dee0 52 5f 4e 4f 4d 45 4d 20 0a 20 20 20 20 20 20 20  R_NOMEM .       
1def0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
1df00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1df10 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  SY;.          }.
1df20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
1df30 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
1df40 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1df50 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
1df60 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1df70 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1df80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
1df90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1dfa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
1dfb0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1dfc0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
1dfd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
1dfe0 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f  = 0;. .        /
1dff0 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
1e000 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1e010 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
1e020 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
1e030 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
1e040 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
1e050 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  ad lock..       
1e060 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
1e070 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1e080 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
1e090 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e0a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e0b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
1e0c0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1e0d0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1e0e0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
1e0f0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1e100 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
1e110 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
1e120 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
1e130 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1e140 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ode && pPager->s
1e150 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45  tate>PAGER_SHARE
1e160 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  D).        );.  
1e170 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
1e180 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b   pPager->pAll ){
1e190 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1e1a0 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
1e1b0 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
1e1c0 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
1e1d0 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20  se file.        
1e1e0 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
1e1f0 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
1e200 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
1e210 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
1e220 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20       ** read or 
1e230 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1e240 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  n).  Check to se
1e250 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
1e260 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73  e.        ** has
1e270 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
1e280 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1e290 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
1e2a0 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 20 20  ush the.        
1e2b0 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
1e2c0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1e2d0 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
1e2e0 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
1e2f0 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
1e300 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
1e310 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
1e320 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
1e330 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
1e340 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
1e350 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 20 20  tes are.        
1e360 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
1e370 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
1e380 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
1e390 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
1e3a0 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
1e3b0 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
1e3c0 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
1e3d0 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
1e3e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
1e3f0 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
1e400 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
1e410 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
1e420 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
1e430 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
1e440 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
1e450 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   be .        ** 
1e460 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
1e470 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
1e480 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
1e490 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
1e4a0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e         ** it can
1e4b0 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
1e4c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1e4d0 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
1e4e0 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
1e4f0 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20  >dbFileVers)];. 
1e500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1e510 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1e520 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  ger);..        i
1e530 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1e540 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
1e550 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
1e560 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Code;.          
1e570 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
1e580 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1e590 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1e5a0 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
1e5b0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
1e5c0 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
1e5d0 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
1e5e0 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
1e5f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e600 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1e610 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
1e620 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
1e630 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
1e640 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e660 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
1e670 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e680 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e690 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
1e6a0 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
1e6b0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
1e6c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1e6d0 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
1e6e0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e6f0 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
1e700 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
1e710 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
1e720 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1e730 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1e740 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e750 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1e760 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
1e770 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  de || pPager->st
1e780 61 74 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45  ate<=PAGER_SHARE
1e790 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
1e7a0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1e7b0 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
1e7c0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1e7d0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
1e7e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 66 61 69 6c      }.  }.. fail
1e7f0 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
1e800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
1e810 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  * pager_unlock()
1e820 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
1e830 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
1e840 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  nd in-memory dat
1e850 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70  abases. */.    p
1e860 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
1e870 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1e880 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1e890 6c 6c 6f 63 61 74 65 20 61 20 50 67 48 64 72 20  llocate a PgHdr 
1e8a0 6f 62 6a 65 63 74 2e 20 20 20 45 69 74 68 65 72  object.   Either
1e8b0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
1e8c0 65 20 6f 72 20 72 65 75 73 65 0a 2a 2a 20 61 6e  e or reuse.** an
1e8d0 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 74 68   existing one th
1e8e0 61 74 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77  at is not otherw
1e8f0 69 73 65 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  ise in use..**.*
1e900 2a 20 41 20 6e 65 77 20 50 67 48 64 72 20 73 74  * A new PgHdr st
1e910 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
1e920 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ed if any of the
1e930 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 0a 2a   following are.*
1e940 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  * true:.**.**   
1e950 20 20 28 31 29 20 20 57 65 20 68 61 76 65 20 6e    (1)  We have n
1e960 6f 74 20 65 78 63 65 65 64 65 64 20 6f 75 72 20  ot exceeded our 
1e970 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 65  maximum allocate
1e980 64 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20  d cache size.** 
1e990 20 20 20 20 20 20 20 20 20 61 73 20 73 65 74 20           as set 
1e9a0 62 79 20 74 68 65 20 22 50 52 41 47 4d 41 20 63  by the "PRAGMA c
1e9b0 61 63 68 65 5f 73 69 7a 65 22 20 63 6f 6d 6d 61  ache_size" comma
1e9c0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32  nd..**.**     (2
1e9d0 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  )  There are no 
1e9e0 75 6e 75 73 65 64 20 50 67 48 64 72 20 6f 62 6a  unused PgHdr obj
1e9f0 65 63 74 73 20 61 76 61 69 6c 61 62 6c 65 20 61  ects available a
1ea00 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a  t this time..**.
1ea10 2a 2a 20 20 20 20 20 28 33 29 20 20 54 68 69 73  **     (3)  This
1ea20 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
1ea30 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1ea40 20 20 20 20 20 28 34 29 20 20 54 68 65 72 65 20       (4)  There 
1ea50 61 72 65 20 6e 6f 20 50 67 48 64 72 20 6f 62 6a  are no PgHdr obj
1ea60 65 63 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ects that do not
1ea70 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
1ea80 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  al.**          f
1ea90 69 6c 65 20 73 79 6e 63 20 61 6e 64 20 61 20 73  ile sync and a s
1eaa0 79 6e 63 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ync of the journ
1eab0 61 6c 20 66 69 6c 65 20 69 73 20 63 75 72 72 65  al file is curre
1eac0 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntly.**         
1ead0 20 70 72 6f 68 69 62 69 74 65 64 2e 0a 2a 2a 0a   prohibited..**.
1eae0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
1eaf0 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  use an existing 
1eb00 50 67 48 64 72 2e 20 20 49 6e 20 6f 74 68 65 72  PgHdr.  In other
1eb10 20 77 6f 72 64 73 2c 20 72 65 75 73 65 20 61 6e   words, reuse an
1eb20 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 50 67 48  .** existing PgH
1eb30 64 72 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  dr if all of the
1eb40 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1eb50 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  rue:.**.**     (
1eb60 31 29 20 20 57 65 20 68 61 76 65 20 72 65 61 63  1)  We have reac
1eb70 68 65 64 20 6f 72 20 65 78 63 65 65 64 65 64 20  hed or exceeded 
1eb80 74 68 65 20 6d 61 78 69 6d 75 6d 20 63 61 63 68  the maximum cach
1eb90 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  e size.**       
1eba0 20 20 20 61 6c 6c 6f 77 65 64 20 62 79 20 22 50     allowed by "P
1ebb0 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
1ebc0 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29  "..**.**     (2)
1ebd0 20 20 54 68 65 72 65 20 69 73 20 61 20 50 67 48    There is a PgH
1ebe0 64 72 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74  dr available wit
1ebf0 68 20 50 67 48 64 72 2d 3e 6e 52 65 66 3d 3d 30  h PgHdr->nRef==0
1ec00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  .**.**     (3)  
1ec10 57 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 61 6e  We are not in an
1ec20 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1ec30 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34  ase.**.**     (4
1ec40 29 20 20 45 69 74 68 65 72 20 74 68 65 72 65 20  )  Either there 
1ec50 69 73 20 61 6e 20 61 76 61 69 6c 61 62 6c 65 20  is an available 
1ec60 50 67 48 64 72 20 74 68 61 74 20 64 6f 65 73 20  PgHdr that does 
1ec70 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20  not need.**     
1ec80 20 20 20 20 20 74 6f 20 62 65 20 73 79 6e 63 65       to be synce
1ec90 64 20 74 6f 20 64 69 73 6b 20 6f 72 20 65 6c 73  d to disk or els
1eca0 65 20 64 69 73 6b 20 73 79 6e 63 69 6e 67 20 69  e disk syncing i
1ecb0 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  s currently.**  
1ecc0 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 2e          allowed.
1ecd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1ece0 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65  agerAllocatePage
1ecf0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1ed00 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20  PgHdr **ppPg){. 
1ed10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ed20 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  _OK;.  PgHdr *pP
1ed30 67 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 48 64  g;.  int nByteHd
1ed40 72 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  r;..  /* Create 
1ed50 61 20 6e 65 77 20 50 67 48 64 72 20 69 66 20 61  a new PgHdr if a
1ed60 6e 79 20 6f 66 20 74 68 65 20 66 6f 75 72 20 63  ny of the four c
1ed70 6f 6e 64 69 74 69 6f 6e 73 20 64 65 66 69 6e 65  onditions define
1ed80 64 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20 61 72  d .  ** above ar
1ed90 65 20 6d 65 74 3a 20 2a 2f 0a 20 20 69 66 28 20  e met: */.  if( 
1eda0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
1edb0 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a 20 20 20  ager->mxPage.   
1edc0 7c 7c 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  || pPager->lru.p
1edd0 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c 7c 20  First==0 .   || 
1ede0 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70 50 61  MEMDB.   || (pPa
1edf0 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
1ee00 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67  ynced==0 && pPag
1ee10 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20  er->doNotSync). 
1ee20 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   ){.    void *pD
1ee30 61 74 61 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ata;.    if( pPa
1ee40 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67  ger->nPage>=pPag
1ee50 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20  er->nHash ){.   
1ee60 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f     pager_resize_
1ee70 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65  hash_table(pPage
1ee80 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  r,.         pPag
1ee90 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20  er->nHash<256 ? 
1eea0 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48  256 : pPager->nH
1eeb0 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66  ash*2);.      if
1eec0 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d  ( pPager->nHash=
1eed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1eee0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1eef0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
1ef00 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
1ef10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ef20 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
1ef30 50 61 67 65 72 29 3b 0a 20 20 20 20 6e 42 79 74  Pager);.    nByt
1ef40 65 48 64 72 20 3d 20 73 69 7a 65 6f 66 28 2a 70  eHdr = sizeof(*p
1ef50 50 67 29 20 2b 20 73 69 7a 65 6f 66 28 75 33 32  Pg) + sizeof(u32
1ef60 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
1ef70 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ra.             
1ef80 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28   + MEMDB*sizeof(
1ef90 50 67 48 69 73 74 6f 72 79 29 3b 0a 20 20 20 20  PgHistory);.    
1efa0 70 50 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  pPg = sqlite3_ma
1efb0 6c 6c 6f 63 28 20 6e 42 79 74 65 48 64 72 20 29  lloc( nByteHdr )
1efc0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b  ;.    if( pPg ){
1efd0 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 73  .      pData = s
1efe0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70  qlite3_malloc( p
1eff0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1f000 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  );.      if( pDa
1f010 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ta==0 ){.       
1f020 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
1f030 67 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67 20  g);.        pPg 
1f040 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1f050 20 7d 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65   }.    pagerEnte
1f060 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  r(pPager);.    i
1f070 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
1f080 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1f090 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
1f0a0 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
1f0b0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
1f0c0 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 6e 42  emset(pPg, 0, nB
1f0d0 79 74 65 48 64 72 29 3b 0a 20 20 20 20 70 50 67  yteHdr);.    pPg
1f0e0 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b  ->pData = pData;
1f0f0 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
1f100 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 70   = pPager;.    p
1f110 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  Pg->pNextAll = p
1f120 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20  Pager->pAll;.   
1f130 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
1f140 70 50 67 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  pPg;.    pPager-
1f150 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 7d 65 6c 73  >nPage++;.  }els
1f160 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63 79 63 6c  e{.    /* Recycl
1f170 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61  e an existing pa
1f180 67 65 20 77 69 74 68 20 61 20 7a 65 72 6f 20 72  ge with a zero r
1f190 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20  ef-count. */.   
1f1a0 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79   rc = pager_recy
1f1b0 63 6c 65 28 70 50 61 67 65 72 2c 20 26 70 50 67  cle(pPager, &pPg
1f1c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1f1d0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
1f1e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f1f0 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20  IOERR_BLOCKED;. 
1f200 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1f210 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f220 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
1f230 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
1f240 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1f250 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48  Pager->state>=SH
1f260 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
1f270 20 61 73 73 65 72 74 28 70 50 67 29 3b 0a 20 20   assert(pPg);.  
1f280 7d 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b  }.  *ppPg = pPg;
1f290 0a 0a 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  ..pager_allocate
1f2a0 5f 6f 75 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  _out:.  return r
1f2b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
1f2c0 20 73 75 72 65 20 77 65 20 68 61 76 65 20 74 68   sure we have th
1f2d0 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20  e content for a 
1f2e0 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61  page.  If the pa
1f2f0 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f  ge was.** previo
1f300 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69  usly acquired wi
1f310 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c  th noContent==1,
1f320 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
1f330 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e  t was.** just in
1f340 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
1f350 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65  os instead of be
1f360 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ing read from di
1f370 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77  sk..** But now w
1f380 65 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20  e need the real 
1f390 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b  data off of disk
1f3a0 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  .  So make sure 
1f3b0 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20  we.** have it.  
1f3c0 52 65 61 64 20 69 74 20 69 6e 20 69 66 20 77 65  Read it in if we
1f3d0 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20   do not have it 
1f3e0 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74  already..*/.stat
1f3f0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74  ic int pager_get
1f400 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a  _content(PgHdr *
1f410 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
1f420 3e 6e 65 65 64 52 65 61 64 20 29 7b 0a 20 20 20  >needRead ){.   
1f430 20 69 6e 74 20 72 63 20 3d 20 72 65 61 64 44 62   int rc = readDb
1f440 50 61 67 65 28 70 50 67 2d 3e 70 50 61 67 65 72  Page(pPg->pPager
1f450 2c 20 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f  , pPg, pPg->pgno
1f460 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1f470 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f480 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20    pPg->needRead 
1f490 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1f4a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f4b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1f4c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f4d0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
1f4e0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  a page..**.** A 
1f4f0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1f500 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62   disk file is ob
1f510 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20  tained when the 
1f520 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63  first page is ac
1f530 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73  quired. .** This
1f540 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72   read lock is dr
1f550 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c  opped when the l
1f560 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
1f570 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ased..**.** This
1f580 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66   routine works f
1f590 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
1f5a0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
1f5b0 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
1f5c0 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
1f5d0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
1f5e0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
1f5f0 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
1f600 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
1f610 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
1f620 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
1f630 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
1f640 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
1f650 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
1f660 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
1f670 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
1f680 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
1f690 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
1f6a0 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
1f6b0 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
1f6c0 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
1f6d0 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
1f6e0 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
1f6f0 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
1f700 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
1f710 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
1f720 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1f730 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
1f740 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
1f750 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
1f760 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
1f770 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
1f780 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
1f790 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
1f7a0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
1f7b0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
1f7c0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
1f7d0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1f7e0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
1f7f0 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
1f800 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
1f810 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
1f820 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
1f830 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
1f840 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
1f850 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
1f860 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
1f870 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
1f880 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
1f890 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
1f8a0 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
1f8b0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
1f8c0 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
1f8d0 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
1f8e0 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
1f8f0 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
1f900 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
1f910 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
1f920 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
1f930 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70   is false, the p
1f940 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
1f950 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
1f960 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20  rom disk..** If 
1f970 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
1f980 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
1f990 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
1f9a0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
1f9b0 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
1f9c0 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  e at this time, 
1f9d0 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64  so do not do a d
1f9e0 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20  isk read.  Just 
1f9f0 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70  fill in the.** p
1fa00 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  age content with
1fa10 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72   zeros.  But mar
1fa20 6b 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  k the fact that 
1fa30 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64  we have not read
1fa40 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
1fa50 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  by setting the P
1fa60 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
1fa70 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69  ag.  Later on, i
1fa80 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  f .** sqlite3Pag
1fa90 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
1faa0 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65  led on this page
1fab0 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
1fac0 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ine is.** called
1fad0 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f   again with noCo
1fae0 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d  ntent==0, that m
1faf0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f  eans that the co
1fb00 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a  ntent is needed.
1fb10 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20  ** and the disk 
1fb20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
1fb30 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
1fb40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1fb50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
1fb60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
1fb70 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1fb80 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
1fb90 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
1fba0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
1fbb0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
1fbc0 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
1fbd0 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
1fbe0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
1fbf0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
1fc00 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
1fc10 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
1fc20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
1fc30 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e  r reading conten
1fc40 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74  t from disk if t
1fc50 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64  rue */.){.  PgHd
1fc60 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
1fc70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1fc80 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1fc90 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  R_UNLOCK || pPag
1fca0 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67  er->nRef>0 || pg
1fcb0 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  no==1 );..  /* T
1fcc0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
1fcd0 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
1fce0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
1fcf0 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
1fd00 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
1fd10 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
1fd20 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
1fd30 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
1fd40 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
1fd50 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
1fd60 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
1fd70 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
1fd80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1fd90 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1fda0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
1fdb0 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
1fdc0 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
1fdd0 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
1fde0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1fdf0 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
1fe00 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  e = 0;..  /* If 
1fe10 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1fe20 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c  t page accessed,
1fe30 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52   then get a SHAR
1fe40 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ED lock.  ** on 
1fe50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fe60 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  e. pagerSharedLo
1fe70 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
1fe80 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62  if .  ** a datab
1fe90 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ase lock is alre
1fea0 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20  ady held..  */. 
1feb0 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65   rc = pagerShare
1fec0 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  dLock(pPager);. 
1fed0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fee0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1fef0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1ff00 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1ff10 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1ff20 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  ;..  pPg = pager
1ff30 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
1ff40 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
1ff50 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1ff60 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
1ff70 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70   is not in the p
1ff80 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
1ff90 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20    int nMax;.    
1ffa0 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47 45 52  int h;.    PAGER
1ffb0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
1ffc0 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  iss);.    rc = p
1ffd0 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65  agerAllocatePage
1ffe0 28 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a  (pPager, &pPg);.
1fff0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
20010 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
20020 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  .    pPg->pgno =
20030 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72   pgno;.    asser
20040 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67 6e  t( !MEMDB || pgn
20050 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  o>pPager->stmtSi
20060 7a 65 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69  ze );.    pPg->i
20070 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
20080 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
20090 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
200a0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d   pgno);.    pPg-
200b0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a  >needSync = 0;..
200c0 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
200d0 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65  g);.    pPg->nRe
200e0 66 20 3d 20 31 3b 0a 0a 20 20 20 20 70 50 61 67  f = 1;..    pPag
200f0 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
20100 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  if( pPager->nExt
20110 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ra>0 ){.      me
20120 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
20130 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
20140 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
20150 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
20160 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 50 61  nMax = sqlite3Pa
20170 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
20180 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ger);.    if( pP
20190 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
201a0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67  .      rc = pPag
201b0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
201c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
201d0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
201e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
201f0 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  }..    /* Popula
20200 74 65 20 74 68 65 20 70 61 67 65 20 77 69 74 68  te the page with
20210 20 64 61 74 61 2c 20 65 69 74 68 65 72 20 62 79   data, either by
20220 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
20230 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
20240 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79 20 73 65  * file, or by se
20250 74 74 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65  tting the entire
20260 20 70 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20   page to zero.. 
20270 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d     */.    if( nM
20280 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  ax<(int)pgno || 
20290 4d 45 4d 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74  MEMDB || (noCont
202a0 65 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ent && !pPager->
202b0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20  alwaysRollback) 
202c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
202d0 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
202e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
202f0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
20300 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
20310 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
20320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
20330 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
20340 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
20350 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
20360 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65       pPg->needRe
20370 61 64 20 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26  ad = noContent &
20380 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  & !pPager->alway
20390 73 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20  sRollback;.     
203a0 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
203b0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
203c0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
203d0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
203e0 72 65 61 64 44 62 50 61 67 65 28 70 50 61 67 65  readDbPage(pPage
203f0 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20  r, pPg, pgno);. 
20400 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20410 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
20420 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
20430 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
20440 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a   pPg->pgno = 0;.
20450 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
20460 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
20470 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
20480 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
20490 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
204a0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
204b0 2a 20 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20  * Link the page 
204c0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 68 61  into the page ha
204d0 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  sh table */.    
204e0 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
204f0 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
20500 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
20510 30 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  0 );.    pPg->pN
20520 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
20530 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20  ->aHash[h];.    
20540 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
20550 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
20560 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
20570 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20580 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
20590 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
205a0 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
205b0 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
205c0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69  = pPg;.    }..#i
205d0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
205e0 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
205f0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
20600 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
20610 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
20620 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
20630 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
20640 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
20650 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70   */.    assert(p
20660 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c  Pager->nRef>0 ||
20670 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50   pgno==1);.    P
20680 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
20690 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 69 66 28  ->nHit);.    if(
206a0 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
206b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
206c0 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
206d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
206e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
206f0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
20700 20 7d 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28   }.    page_ref(
20710 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
20720 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  age = pPg;.  ret
20730 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20740 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20750 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
20760 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
20770 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
20780 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
20790 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
207a0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
207b0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
207c0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
207d0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
207e0 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
207f0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
20800 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  here */.  int no
20810 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a  Content       /*
20820 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72   Do not bother r
20830 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66  eading content f
20840 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65  rom disk if true
20850 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
20860 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
20870 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
20880 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
20890 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  r, pgno, ppPage,
208a0 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70   noContent);.  p
208b0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
208c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
208d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  }.../*.** Acquir
208e0 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
208f0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
20900 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
20910 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
20920 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
20930 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
20940 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
20950 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
20960 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
20970 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
20980 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
20990 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
209a0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
209b0 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
209c0 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
209d0 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
209e0 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
209f0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
20a00 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
20a10 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
20a20 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
20a30 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
20a40 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
20a50 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
20a60 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
20a70 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
20a80 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
20a90 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
20aa0 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
20ab0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
20ac0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
20ad0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
20ae0 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 0a 20 20  dr *pPg = 0;..  
20af0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
20b00 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
20b10 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 70 61 67  gno!=0 );..  pag
20b20 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
20b30 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
20b40 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
20b50 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
20b60 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  ( !pPager->pAll 
20b70 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  || pPager->exclu
20b80 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 7d 65  siveMode );.  }e
20b90 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
20ba0 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
20bb0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
20bc0 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 2f  TE_FULL ){.    /
20bd0 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
20be0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 67    }else if( (pPg
20bf0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
20c00 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 21 3d  pPager, pgno))!=
20c10 30 20 29 7b 0a 20 20 20 20 70 61 67 65 5f 72 65  0 ){.    page_re
20c20 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61  f(pPg);.  }.  pa
20c30 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
20c40 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a  ;.  return pPg;.
20c50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
20c60 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
20c70 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
20c80 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
20c90 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
20ca0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
20cb0 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
20cc0 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
20cd0 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
20ce0 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
20cf0 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
20d00 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
20d10 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
20d20 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
20d30 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
20d40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
20d50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
20d60 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
20d70 2a 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20  *pPager;..  if( 
20d80 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pPg==0 ) return 
20d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
20da0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
20db0 72 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  r;..  /* Decreme
20dc0 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
20dd0 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
20de0 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65  page.  */.  asse
20df0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
20e00 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
20e10 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pPg->pPager);.  
20e20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 0a 20 20  pPg->nRef--;..  
20e30 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
20e40 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
20e50 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
20e60 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72  nces to a page r
20e70 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65  each 0, call the
20e80 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72  .  ** destructor
20e90 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67   and add the pag
20ea0 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
20eb0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
20ec0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 0a 20  g->nRef==0 ){.. 
20ed0 20 20 20 6c 72 75 4c 69 73 74 41 64 64 28 70 50     lruListAdd(pP
20ee0 67 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  g);.    if( pPag
20ef0 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
20f00 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
20f10 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 50 67  >xDestructor(pPg
20f20 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
20f30 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ze);.    }.  .  
20f40 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61    /* When all pa
20f50 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72  ges reach the fr
20f60 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65  eelist, drop the
20f70 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a   read lock from.
20f80 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
20f90 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
20fa0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
20fb0 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f--;.    assert(
20fc0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30   pPager->nRef>=0
20fd0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
20fe0 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28  er->nRef==0 && (
20ff0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
21000 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
21010 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20  ->journalOff>0) 
21020 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 55 6e  ){.      pagerUn
21030 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
21040 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
21050 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
21060 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
21070 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21080 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
21090 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
210a0 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
210b0 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
210c0 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f   a RESERVED.** o
210d0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
210e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
210f0 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
21100 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
21110 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
21120 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
21130 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
21140 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
21150 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
21160 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
21170 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
21180 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
21190 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
211a0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
211b0 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ger){.  sqlite3_
211c0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
211d0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
211e0 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
211f0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
21200 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
21210 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
21220 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74  _CREATE);..  int
21230 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
21240 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
21250 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
21260 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
21270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21280 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
21290 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
212a0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
212b0 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
212c0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
212d0 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c  Pager);.  pagerL
212e0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
212f0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
21300 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
21310 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
21320 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61 67 65  >dbSize);.  page
21330 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
21340 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
21350 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
21360 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
21370 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66  OMEM;.    goto f
21380 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
21390 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  urnal;.  }..  if
213a0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
213b0 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  lOpen==0 ){.    
213c0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
213d0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 66 6c  File ){.      fl
213e0 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f  ags |= (SQLITE_O
213f0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
21400 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
21410 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  MP_JOURNAL);.   
21420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6c   }else{.      fl
21430 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f  ags |= (SQLITE_O
21440 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
21450 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
21460 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
21470 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 72  OMIC_WRITE.    r
21480 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
21490 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  alOpen(.        
214a0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
214b0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
214c0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
214d0 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
214e0 72 29 0a 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a  r).    );.#else.
214f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21500 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
21510 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
21520 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
21530 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
21540 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21550 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
21560 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
21570 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
21580 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
21590 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
215a0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  aster = 0;.    p
215b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
215c0 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
215d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
215e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
215f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
21600 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
21610 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
21620 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
21630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21640 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
21650 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20  pen_journal;.   
21660 20 7d 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d   }.  }.  pPager-
21670 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
21680 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
21690 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
216a0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
216b0 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
216c0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
216d0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
216e0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  nRec = 0;.  if( 
216f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
21700 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
21710 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
21720 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
21730 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
21740 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
21750 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
21760 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d  >dbSize;..  rc =
21770 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
21780 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
21790 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
217a0 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c  oopen && rc==SQL
217b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
217c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
217d0 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29  tmtBegin(pPager)
217e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
217f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
21800 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26  =SQLITE_NOMEM &&
21810 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
21820 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72  R_NOMEM ){.    r
21830 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
21840 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
21850 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
21860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21870 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21880 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
21890 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66  .  return rc;..f
218a0 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
218b0 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 33  urnal:.  sqlite3
218c0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
218d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
218e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
218f0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72  Journal = 0;.  r
21900 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21910 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
21920 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
21930 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
21940 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
21950 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
21960 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
21970 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
21980 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f    sqlite3PagerCo
21990 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 69  mmitPhaseTwo() i
219a0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
219b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
219c0 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
219d0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
219e0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20  te3PagerClose() 
219f0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
21a00 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  *  sqlite3PagerU
21a10 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
21a20 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
21a30 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
21a40 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
21a50 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
21a60 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
21a70 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
21a80 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
21a90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
21aa0 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
21ab0 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
21ac0 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
21ad0 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
21ae0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
21af0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
21b00 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
21b10 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
21b20 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
21b30 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
21b40 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
21b50 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
21b60 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
21b70 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
21b80 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
21b90 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
21ba0 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
21bb0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
21bc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
21bd0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
21be0 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
21bf0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
21c00 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
21c10 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
21c20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
21c30 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
21c40 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
21c50 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
21c60 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
21c70 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
21c80 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
21c90 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
21ca0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
21cb0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
21cc0 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
21cd0 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
21ce0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
21cf0 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69  *.** If exFlag i
21d00 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64  s true, go ahead
21d10 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c   and get an EXCL
21d20 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
21d30 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69  e file.** immedi
21d40 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ately instead of
21d50 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77   waiting until w
21d60 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74  e try to flush t
21d70 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a  he cache.  The.*
21d80 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f  * exFlag is igno
21d90 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63  red if a transac
21da0 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
21db0 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
21dc0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
21dd0 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  (DbPage *pPg, in
21de0 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67  t exFlag){.  Pag
21df0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
21e00 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
21e10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21e20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
21e30 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
21e40 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
21e50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21e60 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
21e70 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
21e80 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
21e90 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
21ea0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21eb0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
21ec0 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
21ed0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
21ee0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
21ef0 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
21f00 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
21f10 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
21f20 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
21f30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21f40 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
21f50 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
21f60 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
21f70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21f80 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
21f90 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
21fa0 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20  SERVED;.        
21fb0 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20  if( exFlag ){.  
21fc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
21fd0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
21fe0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
21ff0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
22000 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
22010 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22020 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  OK ){.        pa
22030 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
22040 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
22050 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
22060 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
22070 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20  Cache = 0;.     
22080 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54 52   PAGERTRACE2("TR
22090 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
220a0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
220b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
220c0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
220d0 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
220e0 46 69 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  File.           
220f0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
22100 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
22110 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
22120 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22130 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
22140 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
22150 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
22160 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
22170 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
22180 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
22190 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
221a0 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
221b0 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
221c0 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
221d0 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20   mode the last. 
221e0 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65     ** time a (re
221f0 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61  ad or write) tra
22200 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63  nsaction was suc
22210 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75  cessfully conclu
22220 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ded.    ** by th
22230 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  is connection. I
22240 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69  nstead of deleti
22250 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
22260 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20  ile it was .    
22270 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  ** kept open and
22280 20 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e   either was trun
22290 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
222a0 20 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77   or its header w
222b0 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72  as.    ** overwr
222c0 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73  itten with zeros
222d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
222e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
222f0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
22300 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
22310 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  DbSize==0 );.   
22320 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22330 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
22340 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
22350 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
22360 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65  er);.    pagerLe
22370 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
22380 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
22390 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
223a0 76 65 63 43 72 65 61 74 65 28 20 70 50 61 67 65  vecCreate( pPage
223b0 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 20 20 20  r->dbSize );.   
223c0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
223d0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  er);.    if( !pP
223e0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
223f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
22400 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
22410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
22420 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
22430 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
22440 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  e;.      rc = wr
22450 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
22460 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
22470 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
22480 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
22490 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
224a0 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53  alOff>0 || rc!=S
224b0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61  QLITE_OK );.  pa
224c0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
224d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
224e0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70  ../*.** Make a p
224f0 61 67 65 20 64 69 72 74 79 2e 20 20 53 65 74 20  age dirty.  Set 
22500 69 74 73 20 64 69 72 74 79 20 66 6c 61 67 20 61  its dirty flag a
22510 6e 64 20 61 64 64 20 69 74 20 74 6f 20 74 68 65  nd add it to the
22520 20 64 69 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c   dirty.** page l
22530 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
22540 6f 69 64 20 6d 61 6b 65 44 69 72 74 79 28 50 67  oid makeDirty(Pg
22550 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
22560 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
22570 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
22580 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
22590 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  r;.    pPg->dirt
225a0 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e  y = 1;.    pPg->
225b0 70 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d  pDirty = pPager-
225c0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 69 66 28  >pDirty;.    if(
225d0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
225e0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
225f0 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69  >pDirty->pPrevDi
22600 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rty = pPg;.    }
22610 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44  .    pPg->pPrevD
22620 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
22630 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70  ager->pDirty = p
22640 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pg;.  }.}../*.**
22650 20 4d 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65   Make a page cle
22660 61 6e 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64  an.  Clear its d
22670 69 72 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d  irty bit and rem
22680 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a  ove it from the.
22690 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 6c 69  ** dirty page li
226a0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
226b0 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48  id makeClean(PgH
226c0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
226d0 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
226e0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
226f0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
22700 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 61  Dirty ){.      a
22710 73 73 65 72 74 28 20 70 50 67 2d 3e 70 44 69 72  ssert( pPg->pDir
22720 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 3d 3d  ty->pPrevDirty==
22730 70 50 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pPg );.      pPg
22740 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44  ->pDirty->pPrevD
22750 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 50 72 65  irty = pPg->pPre
22760 76 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  vDirty;.    }.  
22770 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
22780 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 61  Dirty ){.      a
22790 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65  ssert( pPg->pPre
227a0 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 3d 3d  vDirty->pDirty==
227b0 70 50 67 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pPg );.      pPg
227c0 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44  ->pPrevDirty->pD
227d0 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72  irty = pPg->pDir
227e0 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ty;.    }else{. 
227f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
22800 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ->pPager->pDirty
22810 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 70  ==pPg );.      p
22820 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72  Pg->pPager->pDir
22830 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  ty = pPg->pDirty
22840 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
22850 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
22860 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
22870 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69  ble.  The page i
22880 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
22890 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69  he journal .** i
228a0 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
228b0 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73  e already.  This
228c0 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
228d0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
228e0 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  aking.** changes
228f0 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   to a page..**.*
22900 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
22910 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
22920 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
22930 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  er creates a new
22940 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
22950 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52  acquires a RESER
22960 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
22970 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68  database.  If th
22980 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  e RESERVED.** lo
22990 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ck could not be 
229a0 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72  acquired, this r
229b0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
229c0 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65  QLITE_BUSY.  The
229d0 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
229e0 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66  ine must check f
229f0 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76  or that return v
22a00 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65  alue and be care
22a10 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68  ful not to.** ch
22a20 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
22a30 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f  ta until this ro
22a40 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
22a50 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
22a60 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
22a70 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  le could not be 
22a80 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20  written because 
22a90 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c  the disk is full
22aa0 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72  ,.** then this r
22ab0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
22ac0 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64  QLITE_FULL and d
22ad0 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  oes an immediate
22ae0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c   rollback..** Al
22af0 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69  l subsequent wri
22b00 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f  te attempts also
22b10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
22b20 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a  ULL until there.
22b30 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20  ** is a call to 
22b40 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
22b50 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50  it() or sqlite3P
22b60 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74  agerRollback() t
22b70 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73  o.** reset..*/.s
22b80 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
22b90 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
22ba0 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  ){.  void *pData
22bb0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
22bc0 28 70 50 67 29 3b 0a 20 20 50 61 67 65 72 20 2a  (pPg);.  Pager *
22bd0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
22be0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
22bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
22c00 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f  * Check for erro
22c10 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  rs.  */.  if( pP
22c20 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
22c30 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61   .    return pPa
22c40 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
22c50 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
22c60 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
22c70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
22c80 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  RM;.  }..  asser
22c90 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  t( !pPager->setM
22ca0 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43  aster );..  CHEC
22cb0 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
22cc0 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
22cd0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
22ce0 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
22cf0 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20  ontent==1, that 
22d00 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69  means.  ** we di
22d10 64 6e 27 74 20 72 65 61 6c 6c 79 20 72 65 61 64  dn't really read
22d20 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
22d30 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  of the page.  Th
22d40 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 20 20  is can happen.  
22d50 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29  ** (for example)
22d60 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   when the page i
22d70 73 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f  s being moved to
22d80 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
22d90 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20  But.  ** now we 
22da0 61 72 65 20 28 70 65 72 68 61 70 73 29 20 6d 6f  are (perhaps) mo
22db0 76 69 6e 67 20 74 68 65 20 70 61 67 65 20 6f 66  ving the page of
22dc0 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  f of the freelis
22dd0 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65  t for.  ** reuse
22de0 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
22df0 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67 69 6e 61  know its origina
22e00 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61  l content so tha
22e10 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63  t content.  ** c
22e20 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  an be stored in 
22e30 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
22e40 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65  rnal.  So do the
22e50 20 72 65 61 64 20 61 74 20 74 68 69 73 0a 20 20   read at this.  
22e60 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ** time..  */.  
22e70 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
22e80 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69  ontent(pPg);.  i
22e90 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
22ea0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
22eb0 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
22ec0 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
22ed0 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
22ee0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
22ef0 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
22f00 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
22f10 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
22f20 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69  y..  */.  makeDi
22f30 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20  rty(pPg);.  if( 
22f40 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
22f50 26 20 28 70 61 67 65 49 6e 53 74 61 74 65 6d 65  & (pageInStateme
22f60 6e 74 28 70 50 67 29 20 7c 7c 20 70 50 61 67 65  nt(pPg) || pPage
22f70 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29  r->stmtInUse==0)
22f80 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22f90 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
22fa0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
22fb0 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65  dified = 1;.  }e
22fc0 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lse{..    /* If 
22fd0 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
22fe0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
22ff0 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
23000 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   be.    ** writt
23010 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
23020 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
23030 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
23040 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f  journal.    ** o
23050 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20  r both..    **. 
23060 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63     ** First chec
23070 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
23080 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
23090 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
230a0 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69  .    ** create i
230b0 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  t if it does not
230c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
230d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
230e0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
230f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
23100 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
23110 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  Pg, 0);.    if( 
23120 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23130 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
23140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
23150 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
23160 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
23170 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  D );.    if( !pP
23180 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
23190 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  n && pPager->use
231a0 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  Journal.        
231b0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
231c0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
231d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
231e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
231f0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
23200 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
23210 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23220 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
23230 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
23240 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
23250 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
23260 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a  odified = 1;.  .
23270 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73      /* The trans
23280 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
23290 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
232a0 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
232b0 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
232c0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
232d0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
232e0 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
232f0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
23300 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
23310 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
23320 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
23330 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
23340 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
23350 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
23360 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
23370 4f 70 65 6e 20 7c 7c 20 4d 45 4d 44 42 29 20 29  Open || MEMDB) )
23380 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 74  {.      if( (int
23390 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
233a0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
233b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
233c0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
233d0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
233e0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
233f0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
23400 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
23410 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c  RTRACE3("JOURNAL
23420 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
23430 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
23440 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
23450 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
23460 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29  Hist->pOrig==0 )
23470 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
23480 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74  t->pOrig = sqlit
23490 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65  e3_malloc( pPage
234a0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
234b0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 48           if( !pH
234c0 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
234d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
234e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
234f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23500 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
23510 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f  t->pOrig, PGHDR_
23520 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
23530 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
23540 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
23550 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b            u32 ck
23560 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 63  sum;.          c
23570 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20  har *pData2;..  
23580 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
23590 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
235a0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
235b0 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
235c0 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
235d0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
235e0 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
235f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
23600 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20  rt verifies.    
23610 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
23620 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
23630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
23640 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
23650 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
23660 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74  ;.          pDat
23670 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
23680 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
23690 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
236a0 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
236b0 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
236c0 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20  (u8*)pData2);.  
236d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
236e0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
236f0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
23700 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70  urnalOff, pPg->p
23710 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
23720 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23730 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
23740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
23750 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
23760 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
23770 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
23780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23790 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
237a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
237b0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   4);.           
237c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
237d0 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  Off += pPager->p
237e0 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20  ageSize+4;.     
237f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23800 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23810 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
23820 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
23830 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
23840 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
23850 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  ff, cksum);.    
23860 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
23870 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
23880 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23890 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
238a0 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
238b0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
238c0 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
238e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
238f0 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
23900 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ize));.         
23910 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
23920 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
23930 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
23940 20 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22     PAGERTRACE5("
23950 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
23960 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
23970 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
23990 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
239a0 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
239b0 65 64 53 79 6e 63 2c 20 70 61 67 65 72 5f 70 61  edSync, pager_pa
239c0 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 0a 20  gehash(pPg));.. 
239d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
239e0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
239f0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
23a00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
23a10 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
23a20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
23a30 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
23a40 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f  by the layer abo
23a50 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
23a60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
23a70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23a80 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
23a90 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
23aa0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50   }..          pP
23ab0 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
23ac0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23ad0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
23ae0 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
23af0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
23b00 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
23b10 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
23b20 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  o);.          pP
23b30 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
23b40 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
23b50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
23b60 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
23b70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
23b80 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
23b90 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20  Pager->pInStmt, 
23ba0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
23bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23bc0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
23bd0 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64         pPg->need
23be0 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
23bf0 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26  journalStarted &
23c00 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
23c10 63 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  c;.        PAGER
23c20 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25  TRACE4("APPEND %
23c30 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
23c40 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
23c50 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
23c60 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
23c70 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
23c80 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ync);.      }.  
23c90 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
23ca0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  dSync ){.       
23cb0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
23cc0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
23cd0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
23ce0 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nal = 1;.    }. 
23cf0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
23d00 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
23d10 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
23d20 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
23d30 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
23d40 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
23d50 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
23d60 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
23d70 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
23d80 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
23d90 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
23da0 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
23db0 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
23dc0 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
23dd0 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
23de0 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
23df0 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
23e00 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
23e10 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
23e20 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 49   .     && !pageI
23e30 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20  nStatement(pPg) 
23e40 0a 20 20 20 20 20 26 26 20 28 69 6e 74 29 70 50  .     && (int)pP
23e50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
23e60 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20 29  >stmtSize .    )
23e70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23e80 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
23e90 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
23ea0 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
23eb0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ize );.      if(
23ec0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
23ed0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
23ee0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
23ef0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
23f00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
23f10 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30   pHist->pStmt==0
23f20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   );.        pHis
23f30 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  t->pStmt = sqlit
23f40 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65  e3_malloc( pPage
23f50 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
23f60 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
23f70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
23f80 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
23f90 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f  t->pStmt, PGHDR_
23fa0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
23fb0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
23fc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23fd0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
23fe0 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
23ff0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
24000 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
24010 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
24020 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
24030 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
24040 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24050 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
24060 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2a  Pager->stmtNRec*
24070 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
24080 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 63 68  ize);.        ch
24090 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44  ar *pData2 = COD
240a0 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
240b0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
240c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
240d0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
240e0 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c  r->stfd, offset,
240f0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
24100 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
24110 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24120 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24130 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
24140 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  stfd, pData2, pP
24150 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
24160 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
24170 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47     }.        PAG
24180 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a  ERTRACE3("STMT-J
24190 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
241a0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
241b0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
241c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
241d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
241e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
241f0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
24200 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
24210 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  tmtNRec++;.     
24220 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24230 72 2d 3e 70 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->pInStmt!=0 );
24240 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24250 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
24260 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e  ->pInStmt, pPg->
24270 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
24280 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
24290 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
242a0 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
242b0 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rn..  */.  asser
242c0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
242d0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
242e0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
242f0 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d  dbSize<(int)pPg-
24300 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
24310 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
24320 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28  g->pgno;.    if(
24330 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
24340 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49  r->dbSize==PENDI
24350 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
24360 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
24370 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
24380 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
24390 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
243a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
243b0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 72  n is used to mar
243c0 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61 73  k a data-page as
243d0 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75 73   writable. It us
243e0 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69  es .** pager_wri
243f0 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a  te() to open a j
24400 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
24410 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
24420 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77  y open).** and w
24430 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a 70  rite the page *p
24440 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75 72  Data to the jour
24450 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  nal..**.** The d
24460 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
24470 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
24480 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28  and pager_write(
24490 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
244a0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  * function also 
244b0 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73  deals with the s
244c0 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
244d0 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  e 2 or more page
244e0 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69  s.** fit on a si
244f0 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
24500 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
24510 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70  ll co-resident p
24520 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  ages.** must hav
24530 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
24540 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
24550 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
24560 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
24570 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62  te3PagerWrite(Db
24580 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
24590 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
245a0 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
245b0 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
245c0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
245d0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
245e0 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63  Pgno nPagePerSec
245f0 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  tor = (pPager->s
24600 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72  ectorSize/pPager
24610 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
24620 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
24630 72 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  r);.  if( !MEMDB
24640 20 26 26 20 6e 50 61 67 65 50 65 72 53 65 63 74   && nPagePerSect
24650 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
24660 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
24670 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
24680 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
24690 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
246a0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
246b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246c0 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
246d0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
246e0 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
246f0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
24700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24710 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
24720 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
24730 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
24740 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
24750 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
24760 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   0;..    /* Set 
24770 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
24780 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
24790 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
247a0 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
247b0 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
247c0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
247d0 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
247e0 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
247f0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
24800 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
24810 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
24820 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  c==0 );.    pPag
24830 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20  er->doNotSync = 
24840 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  1;..    /* This 
24850 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68  trick assumes th
24860 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65  at both the page
24870 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
24880 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a  -size are.    **
24890 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65   an integer powe
248a0 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20  r of 2. It sets 
248b0 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20  variable pg1 to 
248c0 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
248d0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
248e0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
248f0 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
24900 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ated on..    */.
24910 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d      pg1 = ((pPg-
24920 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61  >pgno-1) & ~(nPa
24930 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20  gePerSector-1)) 
24940 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43  + 1;..    nPageC
24950 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50 61  ount = sqlite3Pa
24960 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
24970 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ger);.    if( pP
24980 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
24990 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
249a0 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
249b0 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
249c0 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
249d0 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
249e0 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
249f0 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
24a00 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
24a10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
24a20 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
24a30 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
24a40 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
24a50 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
24a60 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
24a70 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
24a80 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
24a90 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
24aa0 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
24ab0 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
24ac0 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
24ad0 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
24ae0 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
24af0 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
24b00 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
24b10 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
24b20 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
24b30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
24b40 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
24b50 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
24b60 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24b70 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
24b80 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
24b90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
24ba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
24bc0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
24bd0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
24be0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65    if( pPage->nee
24bf0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  dSync ){.       
24c00 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
24c10 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
24c20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
24c30 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
24c40 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
24c50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
24c60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
24c70 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
24c80 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
24c90 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
24ca0 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65 64 53  if( pPage->needS
24cb0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
24cc0 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
24cd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24ce0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
24cf0 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
24d00 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
24d10 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20   for any of the 
24d20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  nPage pages .   
24d30 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
24d40 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65  pg1, then it nee
24d50 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72  ds to be set for
24d60 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65   all of them. Be
24d70 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69  cause.    ** wri
24d80 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74  ting to any of t
24d90 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73  hese nPage pages
24da0 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20   may damage the 
24db0 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20  others, the.    
24dc0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
24dd0 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e  must contain syn
24de0 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20  c()ed copies of 
24df0 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  all of them.    
24e00 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  ** before any of
24e10 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69   them can be wri
24e20 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
24e30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
24e40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65     */.    if( ne
24e50 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
24e60 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
24e70 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20  ge && needSync; 
24e80 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50  ii++){.        P
24e90 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61  gHdr *pPage = pa
24ea0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
24eb0 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20  r, pg1+ii);.    
24ec0 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29 20      if( pPage ) 
24ed0 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20  pPage->needSync 
24ee0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
24ef0 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
24f00 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
24f10 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
24f20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
24f30 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  c==1 );.    pPag
24f40 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20  er->doNotSync = 
24f50 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
24f60 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
24f70 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
24f80 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
24f90 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
24fa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
24fb0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
24fc0 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
24fd0 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
24fe0 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
24ff0 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
25000 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74  rWrite().  In ot
25010 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
25020 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
25030 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  ok.** to change 
25040 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
25050 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e  he page..*/.#ifn
25060 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
25070 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
25080 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70  teable(DbPage *p
25090 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
250a0 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64  g->dirty;.}.#end
250b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
250c0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
250d0 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
250e0 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
250f0 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
25100 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
25110 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
25120 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
25130 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
25140 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
25150 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
25160 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
25170 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
25180 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
25190 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
251a0 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
251b0 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
251c0 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
251d0 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
251e0 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
251f0 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
25200 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
25210 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
25220 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
25230 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
25240 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
25250 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
25260 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
25270 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
25280 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
25290 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
252a0 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
252b0 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
252c0 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
252d0 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
252e0 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
252f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
25300 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61  alled, set the a
25310 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
25320 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53  ag to true..** S
25330 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
25340 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  to sqlite3PagerD
25350 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
25360 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a  r the same page.
25370 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74  ** will thereaft
25380 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20  er be ignored.  
25390 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
253a0 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f  y to avoid a pro
253b0 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20  blem.** where a 
253c0 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69  page with data i
253d0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
253e0 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f  reelist during o
253f0 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  ne part of.** a 
25400 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e  transaction then
25410 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
25420 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
25430 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a  g a later part.*
25440 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72  * of the same tr
25450 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65  ansaction and re
25460 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74  used for some ot
25470 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68  her purpose.  Wh
25480 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73  en it.** is firs
25490 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  t added to the f
254a0 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f  reelist, this ro
254b0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
254c0 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a    When reused,.*
254d0 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  * the sqlite3Pag
254e0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
254f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
25500 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  ed.  But because
25510 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e   the.** page con
25520 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64  tains critical d
25530 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65  ata, we still ne
25540 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74  ed to be sure it
25550 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20   gets.** rolled 
25560 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66  back in spite of
25570 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
25580 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
25590 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  call..*/.void sq
255a0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
255b0 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
255c0 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
255d0 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
255e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
255f0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
25600 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75  if( MEMDB ) retu
25610 72 6e 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  rn;.  pagerEnter
25620 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67 2d  (pPager);.  pPg-
25630 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
25640 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  = 1;.  if( pPg->
25650 64 69 72 74 79 20 26 26 20 21 70 50 61 67 65 72  dirty && !pPager
25660 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
25670 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
25680 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
25690 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66  SHARED );.    if
256a0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
256b0 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ==(int)pPg->pgno
256c0 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   && pPager->orig
256d0 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  DbSize<pPager->d
256e0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  bSize ){.      /
256f0 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20  * If this pages 
25700 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
25710 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   in the file and
25720 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72   the file has gr
25730 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72  own.      ** dur
25740 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
25750 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
25760 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68  n do NOT mark th
25770 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
25780 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  .      ** When t
25790 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
257a0 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20   grows, we must 
257b0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
257c0 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20  he last page.   
257d0 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74     ** gets writt
257e0 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  en at least once
257f0 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73   so that the dis
25800 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74  k file will be t
25810 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20  he correct.     
25820 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75   ** size. If you
25830 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   do not write th
25840 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  is page and the 
25850 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
25860 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
25870 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65   disk ends up be
25880 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74  ing too small, t
25890 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  hat can lead to 
258a0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
258b0 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72  * corruption dur
258c0 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61  ing the next tra
258d0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
258e0 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
258f0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
25900 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65  "DONT_WRITE page
25910 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
25920 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
25930 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
25940 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
25950 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
25960 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
25970 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
25980 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg);.#ifdef SQLI
25990 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
259a0 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
259b0 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
259c0 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
259d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
259e0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
259f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  .}../*.** A call
25a00 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
25a10 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
25a20 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62   that if a rollb
25a30 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69  ack occurs,.** i
25a40 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
25a50 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ry to restore th
25a60 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69  e data on the gi
25a70 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a  ven page.  This.
25a80 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
25a90 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
25aa0 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20   have to record 
25ab0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
25ac0 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63  n the.** rollbac
25ad0 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  k journal..**.**
25ae0 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20   If we have not 
25af0 79 65 74 20 61 63 74 75 61 6c 6c 79 20 72 65 61  yet actually rea
25b00 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
25b10 20 74 68 69 73 20 70 61 67 65 20 28 69 66 0a 2a   this page (if.*
25b20 2a 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  * the PgHdr.need
25b30 52 65 61 64 20 66 6c 61 67 20 69 73 20 73 65 74  Read flag is set
25b40 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
25b50 69 6e 65 20 61 63 74 73 20 61 73 20 61 20 70 72  ine acts as a pr
25b60 6f 6d 69 73 65 0a 2a 2a 20 74 68 61 74 20 77 65  omise.** that we
25b70 20 77 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64   will never need
25b80 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67   to read the pag
25b90 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65  e content in the
25ba0 20 66 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74   future..** so t
25bb0 68 65 20 6e 65 65 64 52 65 61 64 20 66 6c 61 67  he needRead flag
25bc0 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
25bd0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
25be0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
25bf0 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
25c00 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
25c10 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
25c20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
25c30 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
25c40 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  r);.  assert( pP
25c50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
25c60 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 0a  ER_RESERVED );..
25c70 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
25c80 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
25c90 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e 74 57 72 69  open, or DontWri
25ca0 74 65 28 29 20 68 61 73 20 62 65 65 6e 20 63 61  te() has been ca
25cb0 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 69  lled on.  ** thi
25cc0 73 20 70 61 67 65 20 28 44 6f 6e 74 57 72 69 74  s page (DontWrit
25cd0 65 28 29 20 73 65 74 73 20 74 68 65 20 61 6c 77  e() sets the alw
25ce0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
25cf0 29 2c 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a  ), then this.  *
25d00 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
25d10 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
25d20 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
25d30 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 70 50 67 2d  lOpen==0 || pPg-
25d40 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
25d50 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
25d60 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
25d70 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
25d80 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  er);.    return;
25d90 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
25da0 4d 45 4d 44 42 20 29 3b 20 20 20 20 2f 2a 20 46  MEMDB );    /* F
25db0 6f 72 20 61 20 6d 65 6d 64 62 2c 20 70 50 61 67  or a memdb, pPag
25dc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
25dd0 69 73 20 61 6c 77 61 79 73 20 30 20 2a 2f 0a 0a  is always 0 */..
25de0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
25df0 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 69 66  CURE_DELETE.  if
25e00 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
25e10 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
25e20 6e 6f 20 3e 20 70 50 61 67 65 72 2d 3e 6f 72 69  no > pPager->ori
25e30 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  gDbSize ){.    r
25e40 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
25e50 66 0a 0a 20 20 2f 2a 20 49 66 20 53 45 43 55 52  f..  /* If SECUR
25e60 45 5f 44 45 4c 45 54 45 20 69 73 20 64 69 73 61  E_DELETE is disa
25e70 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65  bled, then there
25e80 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20   is no way that 
25e90 74 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  this.  ** routin
25ea0 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  e can be called 
25eb0 6f 6e 20 61 20 70 61 67 65 20 66 6f 72 20 77 68  on a page for wh
25ec0 69 63 68 20 73 71 6c 69 74 65 33 50 61 67 65 72  ich sqlite3Pager
25ed0 44 6f 6e 74 57 72 69 74 65 28 29 0a 20 20 2a 2a  DontWrite().  **
25ee0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72   has not been pr
25ef0 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20  eviously called 
25f00 64 75 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20  during the same 
25f10 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
25f20 2a 20 41 6e 64 20 69 66 20 44 6f 6e 74 57 72 69  * And if DontWri
25f30 74 65 28 29 20 68 61 73 20 70 72 65 76 69 6f 75  te() has previou
25f40 73 6c 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  sly been called,
25f50 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
25f60 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d   ** conditions m
25f70 75 73 74 20 62 65 20 6d 65 74 2e 0a 20 20 2a 2f  ust be met..  */
25f80 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
25f90 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  >inJournal && (i
25fa0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
25fb0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
25fc0 7a 65 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ze );..  assert(
25fd0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
25fe0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal!=0 );.  sqli
25ff0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
26000 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
26010 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70   pPg->pgno);.  p
26020 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
26030 31 3b 0a 20 20 70 50 67 2d 3e 6e 65 65 64 52 65  1;.  pPg->needRe
26040 61 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ad = 0;.  if( pP
26050 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
26060 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
26070 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
26080 3e 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  >= pPager->origD
26090 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 71 6c  bSize );.    sql
260a0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
260b0 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70  ager->pInStmt, p
260c0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  Pg->pgno);.  }. 
260d0 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f   PAGERTRACE3("DO
260e0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65  NT_ROLLBACK page
260f0 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
26100 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
26110 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54  (pPager));.  IOT
26120 52 41 43 45 28 28 22 47 41 52 42 41 47 45 20 25  RACE(("GARBAGE %
26130 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
26140 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 70   pPg->pgno)).  p
26150 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
26160 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
26170 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
26180 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
26190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
261a0 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
261b0 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
261c0 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
261d0 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
261e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
261f0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
26200 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
26210 20 69 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a   int isDirect){.
26220 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
26230 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
26240 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  unter;.  int rc 
26250 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
26260 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61  if( !pPager->cha
26270 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a  ngeCountDone ){.
26280 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
26290 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
262a0 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
262b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
262c0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
262d0 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  1, &pPgHdr);.   
262e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
262f0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
26300 0a 20 20 20 20 69 66 28 20 21 69 73 44 69 72 65  .    if( !isDire
26310 63 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ct ){.      rc =
26320 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
26330 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
26340 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
26360 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
26370 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20  (pPgHdr);.      
26380 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
26390 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
263a0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
263b0 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
263c0 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
263d0 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
263e0 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75  /.    change_cou
263f0 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
26400 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67  t4byte((u8*)pPag
26410 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b  er->dbFileVers);
26420 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  .    change_coun
26430 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32  ter++;.    put32
26440 62 69 74 73 28 28 28 63 68 61 72 2a 29 50 47 48  bits(((char*)PGH
26450 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64  DR_TO_DATA(pPgHd
26460 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  r))+24, change_c
26470 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 69 66  ounter);..    if
26480 28 20 69 73 44 69 72 65 63 74 20 26 26 20 70 50  ( isDirect && pP
26490 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
264a0 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ds ){.      cons
264b0 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 50  t void *zBuf = P
264c0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
264d0 48 64 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Hdr);.      rc =
264e0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
264f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
26500 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
26510 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  ze, 0);.    }.. 
26520 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
26530 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
26540 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
26550 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
26560 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
26570 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
26580 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
26590 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
265a0 79 6e 63 20 74 68 65 20 70 61 67 65 72 20 66 69  ync the pager fi
265b0 6c 65 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69  le to disk..*/.i
265c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
265d0 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
265e0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
265f0 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
26600 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
26610 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
26620 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
26630 63 5f 66 6c 61 67 73 29 3b 0a 20 20 70 61 67 65  c_flags);.  page
26640 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
26650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26660 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
26670 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
26680 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65   the pager pPage
26690 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  r. zMaster point
266a0 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  s to the name.**
266b0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
266c0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
266d0 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
266e0 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69   into the indivi
266f0 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  dual.** journal 
26700 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61  file. zMaster ma
26710 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68  y be NULL, which
26720 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
26730 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  as no master.** 
26740 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c  journal (a singl
26750 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
26760 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54  action)..**.** T
26770 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
26780 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  res that the jou
26790 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20  rnal is synced, 
267a0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
267b0 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68  written.** to th
267c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
267d0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
267e0 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68   file synced. Th
267f0 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
26800 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20  t.** remains to 
26810 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
26820 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c  action is to del
26830 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
26840 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74  file (or.** mast
26850 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
26860 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a  if specified)..*
26870 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
26880 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c  f zMaster==NULL,
26890 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f   this does not o
268a0 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69  verwrite a previ
268b0 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73  ous value.** pas
268c0 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  sed to an sqlite
268d0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
268e0 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a  eOne() call..**.
268f0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
26900 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65  nTrunc is non-ze
26910 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ro, then the pag
26920 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  er file is trunc
26930 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e  ated to.** nTrun
26940 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73  c pages (this is
26950 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
26960 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e  cuum databases).
26970 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
26980 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20  nal parameter - 
26990 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65  noSync - is true
269a0 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
269b0 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a  ase file itself.
269c0 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64  ** is not synced
269d0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
269e0 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  t call sqlite3Pa
269f0 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74  gerSync() direct
26a00 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68  ly to.** sync th
26a10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26a20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43  before calling C
26a30 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
26a40 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  to delete the.**
26a50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
26a60 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69   this case..*/.i
26a70 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
26a80 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20  ommitPhaseOne(. 
26a90 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
26aa0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
26ab0 4d 61 73 74 65 72 2c 20 0a 20 20 50 67 6e 6f 20  Master, .  Pgno 
26ac0 6e 54 72 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 6f  nTrunc,.  int no
26ad0 53 79 6e 63 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Sync.){.  int rc
26ae0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
26af0 20 2f 2a 20 49 66 20 6e 6f 20 63 68 61 6e 67 65   /* If no change
26b00 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65  s have been made
26b10 2c 20 77 65 20 63 61 6e 20 6c 65 61 76 65 20 74  , we can leave t
26b20 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 65  he transaction e
26b30 61 72 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  arly..  */.  if(
26b40 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
26b50 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20 20 20  ied==0 &&.      
26b60 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e    (pPager->journ
26b70 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
26b80 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
26b90 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 50   ||.          pP
26ba0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
26bb0 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 61  ode!=0) ){.    a
26bc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
26bd0 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20  irtyCache==0 || 
26be0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
26bf0 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  pen==0 );.    re
26c00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26c10 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
26c20 45 34 28 22 44 41 54 41 42 41 53 45 20 53 59 4e  E4("DATABASE SYN
26c30 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74  C: File=%s zMast
26c40 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c  er=%s nTrunc=%d\
26c50 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  n", .      pPage
26c60 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d  r->zFilename, zM
26c70 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  aster, nTrunc);.
26c80 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
26c90 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ger);..  /* If t
26ca0 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
26cb0 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
26cc0 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
26cd0 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
26ce0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
26cf0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
26d00 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
26d10 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
26d20 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
26d30 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26  !=PAGER_SYNCED &
26d40 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  & !MEMDB && pPag
26d50 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
26d60 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
26d70 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
26d80 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
26d90 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68 65 20  RITE.    /* The 
26da0 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
26db0 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
26dc0 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f 66 20   used if all of 
26dd0 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  the.    ** follo
26de0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
26df0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
26e00 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65  + The file-syste
26e10 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61  m supports the a
26e20 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70  tomic-write prop
26e30 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erty for.    ** 
26e40 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73       blocks of s
26e50 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61  ize page-size, a
26e60 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  nd.    **    + T
26e70 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f  his commit is no
26e80 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
26e90 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
26ea0 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  on, and.    **  
26eb0 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e 65 20    + Exactly one 
26ec0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  page has been mo
26ed0 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65  dified and store
26ee0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
26ef0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
26f00 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d   ** If the optim
26f10 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
26f20 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  sed, then the jo
26f30 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
26f40 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62 65 20  never.    ** be 
26f50 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73  created for this
26f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
26f70 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 65    */.    int use
26f80 41 74 6f 6d 69 63 57 72 69 74 65 20 3d 20 28 0a  AtomicWrite = (.
26f90 20 20 20 20 20 20 20 20 21 7a 4d 61 73 74 65 72          !zMaster
26fa0 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
26fb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
26fc0 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
26fd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
26fe0 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
26ff0 50 61 67 65 72 29 20 26 26 20 0a 20 20 20 20 20  Pager) && .     
27000 20 20 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20     nTrunc==0 && 
27010 0a 20 20 20 20 20 20 20 20 28 30 3d 3d 70 50 61  .        (0==pPa
27020 67 65 72 2d 3e 70 44 69 72 74 79 20 7c 7c 20 30  ger->pDirty || 0
27030 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ==pPager->pDirty
27040 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20 29 3b  ->pDirty).    );
27050 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27060 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
27070 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
27080 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
27090 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
270a0 3b 0a 20 20 20 20 69 66 28 20 75 73 65 41 74 6f  ;.    if( useAto
270b0 6d 69 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20  micWrite ){.    
270c0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
270d0 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
270e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
270f0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66  */.      int off
27100 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
27110 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
27120 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
27130 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
27140 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b  Pager->nRec==1);
27150 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
27160 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
27170 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61  jfd, offset, pPa
27180 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
27190 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
271a0 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20   db file change 
271b0 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c  counter. The fol
271c0 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c  lowing call will
271d0 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a   modify.      **
271e0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
271f0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
27200 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75   page 1 to inclu
27210 64 65 20 74 68 65 20 75 70 64 61 74 65 64 0a 20  de the updated. 
27220 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63       ** change c
27230 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
27240 77 72 69 74 65 20 70 61 67 65 20 31 20 64 69 72  write page 1 dir
27250 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74  ectly to the dat
27260 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
27270 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20  ile. Because of 
27280 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
27290 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
272a0 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65   host file-syste
272b0 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  m, .      ** thi
272c0 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20  s is safe..     
272d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
272e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
272f0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
27300 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
27310 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
27320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
27330 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
27340 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
27350 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
27360 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
27370 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65   !useAtomicWrite
27380 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
27390 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  K ).#endif..    
273a0 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  /* If a master j
273b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
273c0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
273d0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
273e0 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
273f0 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79  file, then no sy
27400 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
27410 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
27420 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77  n it is.    ** w
27430 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65  ritten, then the
27440 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74   process fails t
27450 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
27460 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a   RESERVED to an.
27470 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
27480 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20   lock. The next 
27490 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73  time the process
274a0 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74   tries to commit
274b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
274c0 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20  saction the m-j 
274d0 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61  name will have a
274e0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
274f0 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
27500 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  if( !pPager->set
27510 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
27520 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
27530 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
27540 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
27550 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27560 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
27570 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  it;.#ifndef SQLI
27580 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
27590 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72  UM.      if( nTr
275a0 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc!=0 ){.      
275b0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61    /* If this tra
275c0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64  nsaction has mad
275d0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
275e0 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c  maller, then all
275f0 20 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a   pages.        *
27600 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65  * being discarde
27610 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74  d by the truncat
27620 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74  ion must be writ
27630 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
27640 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
27650 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
27660 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20         Pgno i;. 
27670 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70         int iSkip
27680 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f   = PAGER_MJ_PGNO
27690 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
276a0 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b    for( i=nTrunc+
276b0 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  1; i<=pPager->or
276c0 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b  igDbSize; i++ ){
276d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
276e0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
276f0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
27700 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69  rnal, i) && i!=i
27710 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Skip ){.        
27720 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27730 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
27740 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20   i, &pPg);.     
27750 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27760 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
27770 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
27780 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
27790 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
277a0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
277b0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
277c0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
277d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
277e0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
277f0 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
27800 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20    }.        } . 
27810 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
27820 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61      rc = writeMa
27830 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
27840 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
27850 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27860 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
27870 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63  c_exit;.      rc
27880 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
27890 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
278a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
278b0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
278c0 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53  exit;..#ifndef S
278d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
278e0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54  ACUUM.    if( nT
278f0 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  runc!=0 ){.     
27900 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
27910 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  erTruncate(pPage
27920 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20  r, nTrunc);.    
27930 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27940 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
27950 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  exit;.    }.#end
27960 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  if..    /* Write
27970 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
27980 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
27990 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67   file */.    pPg
279a0 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
279b0 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
279c0 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  ger);.    rc = p
279d0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
279e0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ist(pPg);.    if
279f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27a00 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
27a10 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
27a20 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  R_BLOCKED );.   
27a30 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20     /* The error 
27a40 6d 69 67 68 74 20 68 61 76 65 20 6c 65 66 74 20  might have left 
27a50 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 20 61  the dirty list a
27a60 6c 6c 20 66 6f 75 6c 65 64 20 75 70 20 68 65 72  ll fouled up her
27a70 65 2c 0a 20 20 20 20 20 20 2a 2a 20 62 75 74 20  e,.      ** but 
27a80 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  that does not ma
27a90 74 74 65 72 20 62 65 63 61 75 73 65 20 69 66 20  tter because if 
27aa0 74 68 65 20 69 66 20 74 68 65 20 64 69 72 74 79  the if the dirty
27ab0 20 6c 69 73 74 20 64 69 64 0a 20 20 20 20 20 20   list did.      
27ac0 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65 64  ** get corrupted
27ad0 2c 20 74 68 65 6e 20 74 68 65 20 74 72 61 6e 73  , then the trans
27ae0 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 6f 6c 6c  action will roll
27af0 20 62 61 63 6b 20 61 6e 64 0a 20 20 20 20 20 20   back and.      
27b00 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65 20 64  ** discard the d
27b10 69 72 74 79 20 6c 69 73 74 2e 20 20 54 68 65 72  irty list.  Ther
27b20 65 20 69 73 20 61 6e 20 61 73 73 65 72 74 20 69  e is an assert i
27b30 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72  n.      ** pager
27b40 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
27b50 61 67 65 73 28 29 20 74 68 61 74 20 76 65 72 69  ages() that veri
27b60 66 69 65 73 20 74 68 61 74 20 6e 6f 20 61 74 74  fies that no att
27b70 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20 69 73  empt.      ** is
27b80 20 6d 61 64 65 20 74 6f 20 75 73 65 20 61 6e 20   made to use an 
27b90 69 6e 76 61 6c 69 64 20 64 69 72 74 79 20 6c 69  invalid dirty li
27ba0 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
27bb0 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69     goto sync_exi
27bc0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  t;.    }.    pPa
27bd0 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
27be0 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
27bf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
27c00 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
27c10 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21  ger->noSync && !
27c20 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
27c30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
27c40 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
27c50 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
27c60 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  s);.    }.    IO
27c70 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25  TRACE(("DBSYNC %
27c80 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a  p\n", pPager))..
27c90 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
27ca0 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44  e = PAGER_SYNCED
27cb0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45  ;.  }else if( ME
27cc0 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30  MDB && nTrunc!=0
27cd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
27ce0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
27cf0 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
27d00 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69  );.  }..sync_exi
27d10 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  t:.  if( rc==SQL
27d20 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
27d30 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65  D ){.    /* page
27d40 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
27d50 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65 6d  nter() may attem
27d60 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  pt to obtain an 
27d70 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20 2a  exclusive.     *
27d80 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74   lock to spill t
27d90 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 74  he cache and ret
27da0 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  urn IOERR_BLOCKE
27db0 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20 20  D. But since .  
27dc0 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e 6f     * there is no
27dd0 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63 68   chance the cach
27de0 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e  e is inconsisten
27df0 74 2c 20 69 74 20 69 73 0a 20 20 20 20 20 2a 20  t, it is.     * 
27e00 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72 6e  better to return
27e10 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
27e20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
27e30 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
27e40 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
27e50 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
27e60 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c;.}.../*.** Com
27e70 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  mit all changes 
27e80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
27e90 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20  and release the 
27ea0 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  write lock..**.*
27eb0 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  * If the commit 
27ec0 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
27ed0 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ason, a rollback
27ee0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
27ef0 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
27f00 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
27f10 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  d.  If the commi
27f20 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45  t worked, SQLITE
27f30 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
27f40 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
27f50 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
27f60 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61  seTwo(Pager *pPa
27f70 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
27f80 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
27f90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
27fa0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
27fb0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
27fc0 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
27fd0 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
27fe0 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
27ff0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28000 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
28010 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
28020 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20 20 20  ied==0 &&.      
28030 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e    (pPager->journ
28040 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
28050 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
28060 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 50   ||.          pP
28070 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
28080 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 61  ode!=0) ){.    a
28090 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
280a0 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20  irtyCache==0 || 
280b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
280c0 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  pen==0 );.    re
280d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
280e0 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72    }.  pagerEnter
280f0 28 70 50 61 67 65 72 29 3b 0a 20 20 50 41 47 45  (pPager);.  PAGE
28100 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20  RTRACE2("COMMIT 
28110 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28120 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
28130 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20  EMDB ){.    pPg 
28140 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
28150 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
28160 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  er);.    while( 
28170 70 50 67 20 29 7b 0a 20 20 20 20 20 20 50 67 48  pPg ){.      PgH
28180 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
28190 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
281a0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
281b0 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70    clearHistory(p
281c0 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 67  Hist);.      pPg
281d0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
281e0 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
281f0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69  l = 0;.      pHi
28200 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  st->inStmt = 0;.
28210 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
28220 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ync = 0;.      p
28230 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Hist->pPrevStmt 
28240 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
28250 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
28260 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  g = pPg->pDirty;
28270 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
28280 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 23  r->pDirty = 0;.#
28290 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
282a0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
282b0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
282c0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
282d0 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
282e0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
282f0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
28300 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
28310 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73  rt( !pPg->always
28320 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
28330 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
28340 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
28350 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
28360 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a  >pStmt );.    }.
28370 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65  #endif.    pPage
28380 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
28390 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
283a0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
283b0 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
283c0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
283d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
283e0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
283f0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
28400 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61 67  _SYNCED || !pPag
28410 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
28420 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65  ;.  rc = pager_e
28430 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
28440 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
28450 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20  etMaster);.  rc 
28460 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
28470 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67  ager, rc);.  pag
28480 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
28490 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
284a0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
284b0 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68  all changes.  Th
284c0 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73  e database falls
284d0 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
284e0 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41  HARED mode..** A
284f0 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ll in-memory cac
28500 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20  he pages revert 
28510 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  to their origina
28520 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e  l data contents.
28530 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
28540 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
28550 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
28560 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73  annot fail unles
28570 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  s some other pro
28580 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
28590 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72  owing.** the cor
285a0 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  rect locking pro
285b0 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20  tocol or unless 
285c0 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
285d0 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67  ocess is writing
285e0 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20   trash into the 
285f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51  journal file (SQ
28600 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72  LITE_CORRUPT) or
28610 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69  .** unless a pri
28620 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  or malloc() fail
28630 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ed (SQLITE_NOMEM
28640 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20  ).  Appropriate 
28650 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61  error.** codes a
28660 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  re returned for 
28670 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69  all these occasi
28680 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ons.  Otherwise,
28690 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
286a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
286b0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  t sqlite3PagerRo
286c0 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
286d0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
286e0 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
286f0 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
28700 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
28710 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
28720 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
28730 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d     for(p=pPager-
28740 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  >pAll; p; p=p->p
28750 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
28760 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
28770 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
28780 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  !p->alwaysRollba
28790 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
287a0 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  !p->dirty ){.   
287b0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
287c0 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
287d0 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
287e0 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a  ger))->pOrig );.
287f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28800 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
28810 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
28820 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20  pPager))->pStmt 
28830 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
28840 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  nue;.      }..  
28850 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44      pHist = PGHD
28860 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
28870 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
28880 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
28890 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
288a0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
288b0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70   pHist->pOrig, p
288c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
288d0 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
288e0 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d  RACE3("ROLLBACK-
288f0 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22  PAGE %d of %d\n"
28900 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
28910 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
28920 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28930 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 50    PAGERTRACE3("P
28940 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20  AGE %d is clean 
28950 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  on %d\n", p->pgn
28960 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
28970 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r));.      }.   
28980 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
28990 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  pHist);.      p-
289a0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
289b0 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d    p->inJournal =
289c0 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
289d0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
289e0 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
289f0 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
28a00 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
28a10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
28a20 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
28a30 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
28a40 69 74 65 72 28 70 2c 20 70 50 61 67 65 72 2d 3e  iter(p, pPager->
28a50 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
28a60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
28a70 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
28a80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
28a90 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
28aa0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
28ab0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
28ac0 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  .    pager_trunc
28ad0 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
28ae0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
28af0 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
28b00 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
28b10 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
28b20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28b30 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 61 67  E_OK;.  }..  pag
28b40 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
28b50 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
28b60 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70  dirtyCache || !p
28b70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
28b80 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  en ){.    rc = p
28b90 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
28ba0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
28bb0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
28bc0 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
28bd0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
28be0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
28bf0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
28c00 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
28c10 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
28c20 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
28c30 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
28c40 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
28c50 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
28c60 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
28c70 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
28c80 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
28c90 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
28ca0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
28cb0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
28cc0 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
28cd0 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ED ){.    int rc
28ce0 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  2;.    rc = page
28cf0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
28d00 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d  r, 0);.    rc2 =
28d10 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
28d20 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
28d30 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
28d40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
28d50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28d60 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
28d70 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
28d80 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
28d90 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
28da0 20 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f 72 65   }.  /* pager_re
28db0 73 65 74 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a  set(pPager); */.
28dc0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
28dd0 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20   = -1;..  /* If 
28de0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
28df0 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43  during a ROLLBAC
28e00 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e  K, we can no lon
28e10 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61  ger trust the pa
28e20 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20  ger.  ** cache. 
28e30 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72  So call pager_er
28e40 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79  ror() on the way
28e50 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79   out to make any
28e60 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72   error .  ** per
28e70 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  sistent..  */.  
28e80 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
28e90 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
28ea0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
28eb0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
28ec0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
28ed0 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
28ee0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
28ef0 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
28f00 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
28f10 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
28f20 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
28f30 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  writable..*/.int
28f40 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
28f50 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70  eadonly(Pager *p
28f60 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
28f70 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
28f80 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
28f90 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
28fa0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
28fb0 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74  he pager..*/.int
28fc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
28fd0 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
28fe0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
28ff0 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a  Pager->nRef;.}..
29000 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
29010 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ST./*.** This ro
29020 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
29030 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
29040 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
29050 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65  int *sqlite3Page
29060 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  rStats(Pager *pP
29070 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
29080 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
29090 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ] = pPager->nRef
290a0 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65  ;.  a[1] = pPage
290b0 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d  r->nPage;.  a[2]
290c0 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67   = pPager->mxPag
290d0 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  e;.  a[3] = pPag
290e0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b  er->dbSize;.  a[
290f0 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
29100 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
29110 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
29120 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
29130 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
29140 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
29150 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65  [8] = 0;  /* Use
29160 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e  d to be pPager->
29170 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20  nOvfl */.  a[9] 
29180 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b  = pPager->nRead;
29190 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65  .  a[10] = pPage
291a0 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  r->nWrite;.  ret
291b0 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn a;.}.#endif.
291c0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73  ./*.** Set the s
291d0 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
291e0 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  k point..**.** T
291f0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
29200 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ld be called wit
29210 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
29220 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64  n journal alread
29230 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65  y.** open.  A ne
29240 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  w statement jour
29250 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74  nal is created t
29260 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
29270 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63  to rollback.** c
29280 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67  hanges of a sing
29290 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77  le SQL command w
292a0 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74  ithin a larger t
292b0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
292c0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
292d0 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a  tmtBegin(Pager *
292e0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
292f0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  c;.  assert( !pP
29300 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
29310 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29320 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
29330 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73  R_SHARED );.  as
29340 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
29350 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47  Size>=0 );.  PAG
29360 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42  ERTRACE2("STMT-B
29370 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  EGIN %d\n", PAGE
29380 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
29390 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
293a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
293b0 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  se = 1;.    pPag
293c0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
293d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
293e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
293f0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
29400 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
29410 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65  pen ){.    pPage
29420 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
29430 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
29440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
29450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29460 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
29470 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
29480 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
29490 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d  pPager->pInStmt=
294a0 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =0 );.  pPager->
294b0 70 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  pInStmt = sqlite
294c0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
294d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
294e0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
294f0 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
29500 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29 7b  r->pInStmt==0 ){
29510 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f  .    /* sqlite3O
29520 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
29530 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20  , SHARED_LOCK); 
29540 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
29550 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
29560 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
29570 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ize = pPager->jo
29580 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67  urnalOff;.  pPag
29590 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
295a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
295b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
295c0 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
295d0 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70  r->stmtCksum = p
295e0 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
295f0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
29600 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
29610 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
29620 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
29630 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
29640 3e 73 74 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a  >stfd, pPager->z
29650 53 74 6d 74 4a 72 6e 6c 2c 0a 20 20 20 20 20 20  StmtJrnl,.      
29660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29670 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
29680 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b  PEN_SUBJOURNAL);
29690 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
296a0 20 20 20 20 20 67 6f 74 6f 20 73 74 6d 74 5f 62       goto stmt_b
296b0 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20  egin_failed;.   
296c0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
296d0 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  tmtOpen = 1;.   
296e0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
296f0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  c = 0;.  }.  pPa
29700 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
29710 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
29720 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62  ITE_OK;. .stmt_b
29730 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69  egin_failed:.  i
29740 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  f( pPager->pInSt
29750 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mt ){.    sqlite
29760 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
29770 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b  Pager->pInStmt);
29780 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
29790 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
297a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
297b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
297c0 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  tBegin(Pager *pP
297d0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
297e0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
297f0 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
29800 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61  gerStmtBegin(pPa
29810 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ger);.  pagerLea
29820 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
29830 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29840 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
29850 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
29860 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
29870 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
29880 72 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  r){.  pagerEnter
29890 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
298a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
298b0 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
298c0 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
298d0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
298e0 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  MT-COMMIT %d\n",
298f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
29900 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  );.    if( !MEMD
29910 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71  B ){.      /* sq
29920 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
29930 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
29940 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
29950 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
29960 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29  pPager->pInStmt)
29970 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
29980 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  pInStmt = 0;.   
29990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
299a0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
299b0 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  tmt; pPg; pPg=pN
299c0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ext){.        Pg
299d0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
299e0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
299f0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
29a00 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 48 69       pNext = pHi
29a10 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  st->pNextStmt;. 
29a20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
29a30 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a  Hist->inStmt );.
29a40 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69          pHist->i
29a50 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
29a60 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
29a70 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
29a80 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
29a90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29aa0 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
29ab0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
29ac0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
29ad0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
29ae0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
29af0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
29b00 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
29b10 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
29b20 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
29b30 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
29b40 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   0;.  pagerLeave
29b50 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
29b60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
29b70 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
29b80 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
29b90 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
29ba0 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67  StmtRollback(Pag
29bb0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
29bc0 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e  nt rc;.  pagerEn
29bd0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
29be0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
29bf0 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45  nUse ){.    PAGE
29c00 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f  RTRACE2("STMT-RO
29c10 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
29c20 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
29c30 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
29c40 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
29c50 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  g;.      PgHisto
29c60 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
29c70 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
29c80 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
29c90 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d  =pHist->pNextStm
29ca0 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48 69 73  t){.        pHis
29cb0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
29cc0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
29cd0 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
29ce0 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
29cf0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
29d00 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
29d10 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
29d20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
29d30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
29d40 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e  te3_free(pHist->
29d50 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
29d60 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
29d70 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
29d80 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
29d90 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
29da0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
29db0 20 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63       pager_trunc
29dc0 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
29dd0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
29de0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
29df0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
29e00 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
29e10 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
29e20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
29e30 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
29e40 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
29e50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
29e60 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
29e70 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
29e80 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  0;.  pagerLeave(
29e90 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
29ea0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
29eb0 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
29ec0 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
29ed0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
29ee0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
29ef0 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
29f00 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
29f10 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
29f20 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
29f30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
29f40 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65 20  e VFS structure 
29f50 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  for the pager..*
29f60 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
29f70 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65  vfs *sqlite3Page
29f80 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61 67  rVfs(Pager *pPag
29f90 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
29fa0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f  ager->pVfs;.}../
29fb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
29fc0 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20  file handle for 
29fd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29fe0 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
29ff0 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20  with the pager. 
2a000 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75   This might retu
2a010 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66  rn NULL if the f
2a020 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79  ile has.** not y
2a030 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  et been opened..
2a040 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  */.sqlite3_file 
2a050 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
2a060 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
2a070 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
2a080 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r->fd;.}../*.** 
2a090 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
2a0a0 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
2a0b0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
2a0c0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
2a0d0 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61  3PagerDirname(Pa
2a0e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2a0f0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
2a100 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a  Directory;.}../*
2a110 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
2a120 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
2a130 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2a140 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
2a150 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75  *sqlite3PagerJou
2a160 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
2a170 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
2a180 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
2a190 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
2a1a0 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
2a1b0 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
2a1c0 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
2a1d0 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
2a1e0 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
2a1f0 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
2a200 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
2a210 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  t sqlite3PagerNo
2a220 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
2a230 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2a240 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a  ager->noSync;.}.
2a250 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
2a260 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53  AS_CODEC./*.** S
2a270 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
2a280 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
2a290 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
2a2a0 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
2a2b0 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
2a2c0 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
2a2d0 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
2a2e0 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
2a2f0 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
2a300 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
2a310 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
2a320 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
2a330 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Arg;.}.#endif..#
2a340 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a350 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
2a360 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67  .** Move the pag
2a370 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f  e pPg to locatio
2a380 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69  n pgno in the fi
2a390 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  le..**.** There 
2a3a0 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72  must be no refer
2a3b0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
2a3c0 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  e previously loc
2a3d0 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20  ated at.** pgno 
2a3e0 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70  (which we call p
2a3f0 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68  PgOld) though th
2a400 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77  at page is allow
2a410 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63  ed to be.** in c
2a420 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70 61  ache.  If the pa
2a430 67 65 20 70 72 65 76 69 6f 75 73 20 6c 6f 63 61  ge previous loca
2a440 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e  ted at pgno is n
2a450 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
2a460 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
2a470 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
2a480 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79   put there by by
2a490 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
2a4a0 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
2a4b0 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20  to the page pPg 
2a4c0 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
2a4d0 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
2a4e0 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
2a4f0 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65  ed with pPg (i.e
2a500 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
2a510 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
2a520 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
2a530 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
2a540 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
2a550 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
2a560 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
2a570 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
2a580 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
2a590 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2a5a0 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
2a5b0 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
2a5c0 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
2a5d0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
2a5e0 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
2a5f0 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
2a600 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
2a610 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
2a620 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
2a630 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
2a640 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
2a650 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a660 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73  ctive)..*/.int s
2a670 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
2a680 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
2a690 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20  r, DbPage *pPg, 
2a6a0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
2a6b0 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a  Hdr *pPgOld;  /*
2a6c0 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   The page being 
2a6d0 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a  overwritten. */.
2a6e0 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20    int h;.  Pgno 
2a6f0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
2a700 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ;..  pagerEnter(
2a710 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
2a720 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
2a730 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 35  ;..  PAGERTRACE5
2a740 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
2a750 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
2a760 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
2a770 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
2a780 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2a790 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
2a7a0 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41  , pgno);.  IOTRA
2a7b0 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20  CE(("MOVE %p %d 
2a7c0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
2a7d0 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29  Pg->pgno, pgno))
2a7e0 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  ..  pager_get_co
2a7f0 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66  ntent(pPg);.  if
2a800 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
2a810 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
2a820 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
2a830 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
2a840 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
2a850 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d  int)pgno>pPager-
2a860 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
2a870 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
2a880 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73  dirty );.    ass
2a890 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
2a8a0 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
2a8b0 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  /* Unlink pPg fr
2a8c0 6f 6d 20 69 74 73 20 68 61 73 68 2d 63 68 61 69  om its hash-chai
2a8d0 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  n */.  unlinkHas
2a8e0 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
2a8f0 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
2a900 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
2a910 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67   a page with pag
2a920 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72  e-number pgno, r
2a930 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72  emove it.  ** fr
2a940 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69  om its hash chai
2a950 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
2a960 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
2a970 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
2a980 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
2a990 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
2a9a0 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
2a9b0 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
2a9c0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
2a9d0 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
2a9e0 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 65 65 64    */.  pPg->need
2a9f0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 67 4f  Sync = 0;.  pPgO
2aa00 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
2aa10 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
2aa20 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
2aa30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
2aa40 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  Old->nRef==0 );.
2aa50 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
2aa60 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f  ain(pPager, pPgO
2aa70 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65  ld);.    makeCle
2aa80 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  an(pPgOld);.    
2aa90 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
2aaa0 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63  pPgOld->needSync
2aab0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2aac0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
2aad0 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 69 6e 4a  ;.  }.  pPg->inJ
2aae0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
2aaf0 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
2ab00 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
2ab10 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e  gno);..  /* Chan
2ab20 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ge the page numb
2ab30 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69  er for pPg and i
2ab40 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
2ab50 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e  e new hash-chain
2ab60 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
2ab70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d  gno!=0 );.  pPg-
2ab80 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
2ab90 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
2aba0 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
2abb0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
2abc0 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65  h[h] ){.    asse
2abd0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
2abe0 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d  h[h]->pPrevHash=
2abf0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
2ac00 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
2ac10 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d  vHash = pPg;.  }
2ac20 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
2ac30 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
2ac40 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  h[h];.  pPager->
2ac50 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
2ac60 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
2ac70 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72   = 0;..  makeDir
2ac80 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65  ty(pPg);.  pPage
2ac90 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
2aca0 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  1;.  pPager->dbM
2acb0 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20  odified = 1;..  
2acc0 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
2acd0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
2ace0 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
2acf0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
2ad00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
2ad10 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
2ad20 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
2ad30 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
2ad40 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
2ad50 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
2ad60 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
2ad70 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
2ad80 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
2ad90 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
2ada0 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
2adb0 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
2adc0 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e 20  al bit has been 
2add0 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20  set. This needs 
2ade0 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62  to be remedied b
2adf0 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a  y loading.    **
2ae00 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
2ae10 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
2ae20 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  nd setting the P
2ae30 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
2ae40 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
2ae50 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70 74  * If the attempt
2ae60 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67   to load the pag
2ae70 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d  e into the page-
2ae80 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75  cache fails, (du
2ae90 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61  e.    ** to a ma
2aea0 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69  lloc() or IO fai
2aeb0 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65  lure), clear the
2aec0 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a   bit in the pInJ
2aed0 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20  ournal[].    ** 
2aee0 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65  array. Otherwise
2aef0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
2af00 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74   loaded and writ
2af10 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20  ten again in.   
2af20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
2af30 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20  tion, it may be 
2af40 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
2af50 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
2af60 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  ore.    ** it is
2af70 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
2af80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
2af90 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20  his way, it may 
2afa0 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a  end up in.    **
2afb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2afc0 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68 61  e twice, but tha
2afd0 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  t is not a probl
2afe0 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  em..    **.    *
2aff0 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67  * The sqlite3Pag
2b000 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  erGet() call may
2b010 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
2b020 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
2b030 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
2b040 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
2b050 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
2b060 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oo..    */.    i
2b070 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72  nt rc;.    PgHdr
2b080 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73   *pPgHdr;.    as
2b090 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
2b0a0 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
2b0b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
2b0c0 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
2b0d0 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72  yncPgno, &pPgHdr
2b0e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2b0f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b100 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
2b110 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
2b120 29 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70  )needSyncPgno<=p
2b130 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
2b140 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
2b150 69 74 65 33 42 69 74 76 65 63 43 6c 65 61 72 28  ite3BitvecClear(
2b160 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2b170 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  al, needSyncPgno
2b180 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2b190 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
2b1a0 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
2b1b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2b1c0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2b1d0 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72   = 1;.    pPgHdr
2b1e0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
2b1f0 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f      pPgHdr->inJo
2b200 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d  urnal = 1;.    m
2b210 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29  akeDirty(pPgHdr)
2b220 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
2b230 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
2b240 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 4c 65 61  .  }..  pagerLea
2b250 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
2b260 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b270 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2b280 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2b290 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72   to the data for
2b2a0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
2b2b0 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
2b2c0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
2b2d0 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
2b2e0 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54    return PGHDR_T
2b2f0 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a  O_DATA(pPg);.}..
2b300 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
2b310 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
2b320 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
2b330 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63   of "extra" spac
2b340 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  e .** allocated 
2b350 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73  along with the s
2b360 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
2b370 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
2b380 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50  agerGetExtra(DbP
2b390 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
2b3a0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
2b3b0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  ->pPager;.  retu
2b3c0 72 6e 20 28 70 50 61 67 65 72 3f 50 47 48 44 52  rn (pPager?PGHDR
2b3d0 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
2b3e0 50 61 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a  Pager):0);.}../*
2b3f0 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
2b400 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72  locking-mode for
2b410 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72   this pager. Par
2b420 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73  ameter eMode mus
2b430 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50  t be one.** of P
2b440 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2b450 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f  _QUERY, PAGER_LO
2b460 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
2b470 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f   or .** PAGER_LO
2b480 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2b490 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61  IVE. If the para
2b4a0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55  meter is not _QU
2b4b0 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ERY, then.** the
2b4c0 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73   locking-mode is
2b4d0 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
2b4e0 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  e specified..**.
2b4f0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
2b500 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
2b510 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2b520 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50  E_NORMAL or.** P
2b530 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2b540 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69  _EXCLUSIVE, indi
2b550 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65  cating the curre
2b560 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64  nt (possibly upd
2b570 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  ated).** locking
2b580 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
2b590 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
2b5a0 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  gMode(Pager *pPa
2b5b0 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
2b5c0 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
2b5d0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2b5e0 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
2b5f0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
2b600 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2b610 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20  E_NORMAL.       
2b620 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
2b630 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2b640 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
2b650 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
2b660 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c  CKINGMODE_QUERY<
2b670 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  0 );.  assert( P
2b680 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2b690 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41  _NORMAL>=0 && PA
2b6a0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2b6b0 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a  EXCLUSIVE>=0 );.
2b6c0 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26    if( eMode>=0 &
2b6d0 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
2b6e0 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ile ){.    pPage
2b6f0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2b700 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20   = eMode;.  }.  
2b710 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
2b720 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2b730 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  e;.}../*.** Get/
2b740 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  set the journal-
2b750 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
2b760 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
2b770 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
2b780 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4a 4f 55  .** of PAGER_JOU
2b790 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 2c 20  RNALMODE_QUERY, 
2b7a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2b7b0 45 5f 44 45 4c 45 54 45 20 6f 72 20 0a 2a 2a 20  E_DELETE or .** 
2b7c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2b7d0 45 5f 50 45 52 53 49 53 54 2e 20 49 66 20 74 68  E_PERSIST. If th
2b7e0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
2b7f0 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
2b800 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  ** the journal-m
2b810 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
2b820 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
2b830 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
2b840 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
2b850 69 74 68 65 72 20 50 41 47 45 52 5f 4a 4f 55 52  ither PAGER_JOUR
2b860 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 6f  NALMODE_DELETE o
2b870 72 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e  r.** PAGER_JOURN
2b880 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2c 20  ALMODE_PERSIST, 
2b890 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63  indicating the c
2b8a0 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
2b8b0 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6a 6f 75   updated).** jou
2b8c0 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  rnal-mode..*/.in
2b8d0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  t sqlite3PagerJo
2b8e0 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20  urnalMode(Pager 
2b8f0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
2b900 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65  de){.  assert( e
2b910 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2b920 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  NALMODE_QUERY.  
2b930 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
2b940 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2b950 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20  LMODE_DELETE.   
2b960 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
2b970 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
2b980 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
2b990 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
2b9a0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
2b9b0 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73  MODE_OFF );.  as
2b9c0 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
2b9d0 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  NALMODE_QUERY<0 
2b9e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
2b9f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
2ba00 45 4c 45 54 45 3e 3d 30 20 26 26 20 50 41 47 45  ELETE>=0 && PAGE
2ba10 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
2ba20 52 53 49 53 54 3e 3d 30 20 29 3b 0a 20 20 69 66  RSIST>=0 );.  if
2ba30 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20 20  ( eMode>=0 ){.  
2ba40 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2ba50 6c 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20  lMode = eMode;. 
2ba60 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
2ba70 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  )pPager->journal
2ba80 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Mode;.}..#ifdef 
2ba90 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
2baa0 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
2bab0 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
2bac0 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
2bad0 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
2bae0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
2baf0 67 65 72 52 65 66 64 75 6d 70 28 50 61 67 65 72  gerRefdump(Pager
2bb00 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
2bb10 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70  dr *pPg;.  for(p
2bb20 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
2bb30 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
2bb40 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
2bb50 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pPg->nRef<=0 )
2bb60 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
2bb70 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
2bb80 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72  f("PAGE %3d addr
2bb90 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20  =%p nRef=%d\n", 
2bba0 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e  .       pPg->pgn
2bbb0 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
2bbc0 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66  (pPg), pPg->nRef
2bbd0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
2bbe0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2bbf0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
2bc00 0a                                               .