/ Hex Artifact Content
Login

Artifact ed2fc0ff7297001d17e299f976e9167f265ad2a6:


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 31  : pager.c,v 1.41
0350: 38 20 32 30 30 38 2f 30 33 2f 31 39 20 31 34 3a  8 2008/03/19 14:
0360: 31 35 3a 33 35 20 64 72 68 20 45 78 70 20 24 0a  15:35 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 63 68 61 6e 67 65  E */.  u8 change
3fb0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
3fc0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
3fd0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
3fe0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
3ff0: 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67  */.  u32 vfsFlag
4000: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
4010: 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71   /* Flags for sq
4020: 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
4030: 29 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  ) */.  int errCo
4040: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
4050: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
4060: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
4070: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62  rors */.  int db
4080: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4090: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
40a0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
40b0: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  file */.  int or
40c0: 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20  igDbSize;       
40d0: 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20        /* dbSize 
40e0: 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
40f0: 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69  nt change */.  i
4100: 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20  nt stmtSize;    
4110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
4120: 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28  ze of database (
4130: 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74 6d  in pages) at stm
4140: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  t_begin() */.  i
4150: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
4160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4170: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
4180: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
4190: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
41a0: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
41b0: 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72        /* Quasi-r
41c0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65  andom value adde
41d0: 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b  d to every check
41e0: 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  sum */.  int stm
41f0: 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  tNRec;          
4200: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4210: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d  f records in stm
4220: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
4230: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20    int nExtra;   
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4250: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
4260: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
4270: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
4280: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
4290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
42a0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
42b0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  in a page */.  i
42c0: 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
42e0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
42f0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f  -memory pages */
4300: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4320: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  * Number of in-m
4330: 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68  emory pages with
4340: 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f   PgHdr.nRef>0 */
4350: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4370: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
4380: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c   of pages to hol
4390: 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  d in cache */.  
43a0: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
43c0: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
43d0: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
43e0: 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ase */.  Bitvec 
43f0: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
4400: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
4410: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
4420: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4430: 6c 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  le */.  Bitvec *
4440: 70 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  pInStmt;        
4450: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
4460: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
4470: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
4480: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
4490: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
44a0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
44b0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
44c0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
44e0: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
44f0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
4500: 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20  r *zDirectory;  
4510: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
4520: 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62  ctory hold datab
4530: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
4540: 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  files */.  char 
4550: 2a 7a 53 74 6d 74 4a 72 6e 6c 3b 20 20 20 20 20  *zStmtJrnl;     
4560: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
4570: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
4580: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4590: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
45a0: 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 2f 2a  fd, *jfd;     /*
45b0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
45c0: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61  s for database a
45d0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nd journal */.  
45e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 74  sqlite3_file *st
45f0: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
4600: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
4610: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
4620: 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20   subjournal*/.  
4630: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
4640: 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50  syHandler;  /* P
4650: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
4660: 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  .busyHandler */.
4670: 20 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 6c    PagerLruList l
4680: 72 75 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ru;           /*
4690: 20 4c 52 55 20 6c 69 73 74 20 6f 66 20 66 72 65   LRU list of fre
46a0: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  e pages */.  PgH
46b0: 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20  dr *pAll;       
46c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
46d0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
46e0: 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b  .  PgHdr *pStmt;
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4700: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
4710: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
4720: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
4730: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20   PgHdr *pDirty; 
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4750: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72 74  List of all dirt
4760: 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36 34  y pages */.  i64
4770: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20   journalOff;    
4780: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4790: 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20  ent byte offset 
47a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
47b0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
47c0: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
47d0: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
47e0: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
47f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
4800: 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f  /.  i64 stmtHdrO
4810: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
4820: 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c  /* First journal
4830: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
4840: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
4850: 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75  /.  i64 stmtCksu
4860: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
4870: 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65  /* cksumInit whe
4880: 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  n statement was 
4890: 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36 34  started */.  i64
48a0: 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20   stmtJSize;     
48b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
48c0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73   of journal at s
48d0: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
48e0: 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b   int sectorSize;
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4900: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
4910: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
4920: 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ack */.#ifdef SQ
4930: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
4940: 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20  nHit, nMiss;    
4950: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
4960: 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e   hits and missin
4970: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64  g */.  int nRead
4980: 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  , nWrite;       
4990: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
49a0: 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65  ages read/writte
49b0: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  n */.#endif.  vo
49c0: 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72  id (*xDestructor
49d0: 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20  )(DbPage*,int); 
49e0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
49f0: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
4a00: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69  g pages */.  voi
4a10: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44  d (*xReiniter)(D
4a20: 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20 2f  bPage*,int);   /
4a30: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
4a40: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
4a50: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64  ng pages */.#ifd
4a60: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
4a70: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
4a80: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
4a90: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
4aa0: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
4ab0: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
4ac0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
4ad0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g;            /*
4ae0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
4af0: 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23  to xCodec() */.#
4b00: 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 48 61 73  endif.  int nHas
4b10: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
4b20: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
4b30: 68 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61  he pager hash ta
4b40: 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ble */.  PgHdr *
4b50: 2a 61 48 61 73 68 3b 20 20 20 20 20 20 20 20 20  *aHash;         
4b60: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
4b70: 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e  le to map page n
4b80: 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a  umber to PgHdr *
4b90: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4ba0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
4bb0: 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72  NAGEMENT.  Pager
4bc0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
4bd0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 75 62 6c 79         /* Doubly
4be0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
4bf0: 70 61 67 65 72 73 20 6f 6e 20 77 68 69 63 68 20  pagers on which 
4c00: 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 72 65  */.  Pager *pPre
4c10: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
4c20: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c 65   /* sqlite3_rele
4c30: 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 77 69 6c  ase_memory() wil
4c40: 6c 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 6e 74 20  l work */.  int 
4c50: 69 49 6e 55 73 65 4d 4d 3b 20 20 20 20 20 20 20  iInUseMM;       
4c60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a          /* Non-z
4c70: 65 72 6f 20 69 66 20 75 6e 61 76 61 69 6c 61 62  ero if unavailab
4c80: 6c 65 20 74 6f 20 4d 4d 20 2a 2f 0a 20 20 69 6e  le to MM */.  in
4c90: 74 20 69 49 6e 55 73 65 44 42 3b 20 20 20 20 20  t iInUseDB;     
4ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e            /* Non
4cb0: 2d 7a 65 72 6f 20 69 66 20 69 6e 20 73 71 6c 69  -zero if in sqli
4cc0: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
4cd0: 72 79 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ry() */.#endif. 
4ce0: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
4cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4d00: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
4d10: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
4d20: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63  r tmp use */.  c
4d30: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
4d40: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
4d50: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
4d60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
4d70: 6e 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  nges */.};../*.*
4d80: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4d90: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
4da0: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
4db0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
4dc0: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
4dd0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
4de0: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
4df0: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
4e00: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
4e10: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
4e20: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
4e30: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4e40: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
4e50: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
4e60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
4e70: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
4e80: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
4e90: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
4ea0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
4eb0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
4ec0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
4ed0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
4ee0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
4ef0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
4f00: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4f10: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
4f20: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
4f30: 61 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  al */.int sqlite
4f40: 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
4f50: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4f60: 4e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  Number of cache 
4f70: 70 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a 23  pages freed */.#
4f80: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
4f90: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
4fa0: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
4fb0: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
4fc0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
4fd0: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 70 6f 69  ing variable poi
4fe0: 6e 74 73 20 74 6f 20 74 68 65 20 68 65 61 64 20  nts to the head 
4ff0: 6f 66 20 61 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b  of a double-link
5000: 65 64 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c  ed list.** of al
5010: 6c 20 70 61 67 65 72 73 20 74 68 61 74 20 61 72  l pagers that ar
5020: 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70  e eligible for p
5030: 61 67 65 20 73 74 65 61 6c 69 6e 67 20 62 79 20  age stealing by 
5040: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72  the.** sqlite3_r
5050: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20  elease_memory() 
5060: 69 6e 74 65 72 66 61 63 65 2e 20 20 41 63 63 65  interface.  Acce
5070: 73 73 20 74 6f 20 74 68 69 73 20 6c 69 73 74 20  ss to this list 
5080: 69 73 0a 2a 2a 20 70 72 6f 74 65 63 74 65 64 20  is.** protected 
5090: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 55  by the SQLITE_MU
50a0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 20  TEX_STATIC_MEM2 
50b0: 6d 75 74 65 78 2e 0a 2a 2f 0a 23 69 66 64 65 66  mutex..*/.#ifdef
50c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
50d0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
50e0: 0a 73 74 61 74 69 63 20 50 61 67 65 72 20 2a 73  .static Pager *s
50f0: 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20  qlite3PagerList 
5100: 3d 20 30 3b 0a 73 74 61 74 69 63 20 50 61 67 65  = 0;.static Page
5110: 72 4c 72 75 4c 69 73 74 20 73 71 6c 69 74 65 33  rLruList sqlite3
5120: 4c 72 75 50 61 67 65 4c 69 73 74 20 3d 20 7b 30  LruPageList = {0
5130: 2c 20 30 2c 20 30 7d 3b 0a 23 65 6e 64 69 66 0a  , 0, 0};.#endif.
5140: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
5150: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
5160: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
5170: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
5180: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
5190: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
51a0: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
51b0: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
51c0: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
51d0: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
51e0: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
51f0: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
5200: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
5210: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
5220: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
5230: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
5240: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
5250: 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a  rnal is begin.**
5260: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
5270: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
5280: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
5290: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
52a0: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
52b0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
52c0: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
52d0: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
52e0: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
52f0: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
5300: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
5310: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
5320: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
5330: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
5340: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
5350: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
5360: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
5370: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
5380: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
5390: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
53a0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
53b0: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
53c0: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
53d0: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
53e0: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
53f0: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
5400: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
5410: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
5420: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
5430: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
5440: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
5450: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
5460: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
5470: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
5480: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
5490: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
54a0: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
54b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
54c0: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
54d0: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
54e0: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
54f0: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
5500: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
5510: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
5520: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
5530: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
5540: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
5550: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
5560: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
5570: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
5580: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
5590: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
55a0: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
55b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
55c0: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
55d0: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
55e0: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
55f0: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
5600: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
5610: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
5620: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
5630: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
5640: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
5650: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
5660: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
5670: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
5680: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
5690: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
56a0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
56b0: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
56c0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
56d0: 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20  e header and of 
56e0: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
56f0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65   journal is dete
5700: 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65  rmined.** by the
5710: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
5720: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  s..*/.#define JO
5730: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
5740: 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70  er)  ((pPager->p
5750: 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f  ageSize) + 8)../
5760: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
5770: 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72   header size for
5780: 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20   this pager. In 
5790: 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73  the future, this
57a0: 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74   could be.** set
57b0: 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72   to some value r
57c0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ead from the dis
57d0: 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68  k controller. Th
57e0: 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63  e important.** c
57f0: 68 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73  haracteristic is
5800: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
5810: 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64  same size as a d
5820: 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23  isk sector..*/.#
5830: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
5840: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
5850: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
5860: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
5870: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
5880: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
5890: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
58a0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
58b0: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
58c0: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
58d0: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
58e0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
58f0: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
5900: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
5910: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
5920: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
5930: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
5940: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
5950: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
5960: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
5970: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
5980: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
5990: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
59a0: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
59b0: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
59c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e  if../*.** Page n
59d0: 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50  umber PAGER_MJ_P
59e0: 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65  GNO is never use
59f0: 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  d in an SQLite d
5a00: 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a  atabase (it is.*
5a10: 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  * reserved for w
5a20: 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20  orking around a 
5a30: 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e  windows/posix in
5a40: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20  compatibility). 
5a50: 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e  It is.** used in
5a60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
5a70: 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65  signify that the
5a80: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
5a90: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  e journal file .
5aa0: 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f  ** is devoted to
5ab0: 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65   storing a maste
5ac0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d  r journal name -
5ad0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
5ae0: 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72  re pages to.** r
5af0: 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f  oll back. See co
5b00: 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74  mments for funct
5b10: 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ion writeMasterJ
5b20: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74  ournal() for det
5b30: 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66  ails..*/./* #def
5b40: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
5b50: 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59  O(x) (PENDING_BY
5b60: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
5b70: 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  e)) */.#define P
5b80: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
5b90: 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28  ((PENDING_BYTE/(
5ba0: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b  (x)->pageSize))+
5bb0: 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  1)../*.** The ma
5bc0: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
5bd0: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
5be0: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
5bf0: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
5c00: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a   2147483647../*.
5c10: 2a 2a 20 54 68 65 20 70 61 67 65 72 45 6e 74 65  ** The pagerEnte
5c20: 72 28 29 20 61 6e 64 20 70 61 67 65 72 4c 65 61  r() and pagerLea
5c30: 76 65 28 29 20 72 6f 75 74 69 6e 65 73 20 61 63  ve() routines ac
5c40: 71 75 69 72 65 20 61 6e 64 20 72 65 6c 65 61 73  quire and releas
5c50: 65 0a 2a 2a 20 61 20 6d 75 74 65 78 20 6f 6e 20  e.** a mutex on 
5c60: 65 61 63 68 20 70 61 67 65 72 2e 20 20 54 68 65  each pager.  The
5c70: 20 6d 75 74 65 78 20 69 73 20 72 65 63 75 72 73   mutex is recurs
5c80: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
5c90: 69 73 20 61 20 73 70 65 63 69 61 6c 2d 70 75 72  is a special-pur
5ca0: 70 6f 73 65 20 6d 75 74 65 78 2e 20 20 49 74 20  pose mutex.  It 
5cb0: 6f 6e 6c 79 20 70 72 6f 76 69 64 65 73 20 6d 75  only provides mu
5cc0: 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 0a 2a  tual exclusion.*
5cd0: 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 42 74  * between the Bt
5ce0: 72 65 65 20 61 6e 64 20 74 68 65 20 4d 65 6d 6f  ree and the Memo
5cf0: 72 79 20 4d 61 6e 61 67 65 6d 65 6e 74 20 73 71  ry Management sq
5d00: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
5d10: 6d 6f 72 79 28 29 0a 2a 2a 20 66 75 6e 63 74 69  mory().** functi
5d20: 6f 6e 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  on.  It does not
5d30: 20 70 72 65 76 65 6e 74 2c 20 66 6f 72 20 65 78   prevent, for ex
5d40: 61 6d 70 6c 65 2c 20 74 77 6f 20 42 74 72 65 65  ample, two Btree
5d50: 73 20 66 72 6f 6d 20 61 63 63 65 73 73 69 6e 67  s from accessing
5d60: 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 70 61 67  .** the same pag
5d70: 65 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  er at the same t
5d80: 69 6d 65 2e 20 20 4f 74 68 65 72 20 67 65 6e 65  ime.  Other gene
5d90: 72 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74 65  ral-purpose mute
5da0: 78 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 62 74  xes in.** the bt
5db0: 72 65 65 20 6c 61 79 65 72 20 68 61 6e 64 6c 65  ree layer handle
5dc0: 20 74 68 61 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a   that chore..*/.
5dd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
5de0: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
5df0: 47 45 4d 45 4e 54 0a 20 20 73 74 61 74 69 63 20  GEMENT.  static 
5e00: 76 6f 69 64 20 70 61 67 65 72 45 6e 74 65 72 28  void pagerEnter(
5e10: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 20 20 70  Pager *p){.    p
5e20: 2d 3e 69 49 6e 55 73 65 44 42 2b 2b 3b 0a 20 20  ->iInUseDB++;.  
5e30: 20 20 69 66 28 20 70 2d 3e 69 49 6e 55 73 65 4d    if( p->iInUseM
5e40: 4d 20 26 26 20 70 2d 3e 69 49 6e 55 73 65 44 42  M && p->iInUseDB
5e50: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
5e60: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
5e70: 78 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 20 3d  x;.      mutex =
5e80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
5e90: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
5ea0: 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a  X_STATIC_MEM2);.
5eb0: 20 20 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44        p->iInUseD
5ec0: 42 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  B = 0;.      sql
5ed0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
5ee0: 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 70  (mutex);.      p
5ef0: 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 31 3b 0a  ->iInUseDB = 1;.
5f00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
5f10: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29  tex_leave(mutex)
5f20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
5f30: 72 74 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d 3d  rt( p->iInUseMM=
5f40: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 74 61 74  =0 );.  }.  stat
5f50: 69 63 20 76 6f 69 64 20 70 61 67 65 72 4c 65 61  ic void pagerLea
5f60: 76 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  ve(Pager *p){.  
5f70: 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 2d 2d 3b    p->iInUseDB--;
5f80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
5f90: 69 49 6e 55 73 65 44 42 3e 3d 30 20 29 3b 0a 20  iInUseDB>=0 );. 
5fa0: 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
5fb0: 65 20 70 61 67 65 72 45 6e 74 65 72 28 58 29 0a  e pagerEnter(X).
5fc0: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 4c 65  # define pagerLe
5fd0: 61 76 65 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  ave(X).#endif../
5fe0: 2a 0a 2a 2a 20 41 64 64 20 70 61 67 65 20 70 50  *.** Add page pP
5ff0: 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  g to the end of 
6000: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
6010: 6d 61 6e 61 67 65 64 20 62 79 20 73 74 72 75 63  managed by struc
6020: 74 75 72 65 0a 2a 2a 20 70 4c 69 73 74 20 28 70  ture.** pList (p
6030: 50 67 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  Pg becomes the l
6040: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
6050: 20 6c 69 73 74 20 2d 20 74 68 65 20 6d 6f 73 74   list - the most
6060: 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 75 73   recently .** us
6070: 65 64 29 2e 20 41 72 67 75 6d 65 6e 74 20 70 4c  ed). Argument pL
6080: 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74  ink should point
6090: 20 74 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e   to either pPg->
60a0: 66 72 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72  free or pPg->gfr
60b0: 65 65 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67  ee,.** depending
60c0: 20 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67 20   on whether pPg 
60d0: 69 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  is being added t
60e0: 6f 20 74 68 65 20 70 61 67 65 72 2d 73 70 65 63  o the pager-spec
60f0: 69 66 69 63 20 6f 72 0a 2a 2a 20 67 6c 6f 62 61  ific or.** globa
6100: 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73  l LRU list..*/.s
6110: 74 61 74 69 63 20 76 6f 69 64 20 6c 69 73 74 41  tatic void listA
6120: 64 64 28 50 61 67 65 72 4c 72 75 4c 69 73 74 20  dd(PagerLruList 
6130: 2a 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72 75  *pList, PagerLru
6140: 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48  Link *pLink, PgH
6150: 64 72 20 2a 70 50 67 29 7b 0a 20 20 70 4c 69 6e  dr *pPg){.  pLin
6160: 6b 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  k->pNext = 0;.  
6170: 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70  pLink->pPrev = p
6180: 4c 69 73 74 2d 3e 70 4c 61 73 74 3b 0a 0a 23 69  List->pLast;..#i
6190: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
61a0: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
61b0: 4d 45 4e 54 0a 20 20 61 73 73 65 72 74 28 70 4c  MENT.  assert(pL
61c0: 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72 65 65 20  ink==&pPg->free 
61d0: 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e  || pLink==&pPg->
61e0: 67 66 72 65 65 29 3b 0a 20 20 61 73 73 65 72 74  gfree);.  assert
61f0: 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66  (pLink==&pPg->gf
6200: 72 65 65 20 7c 7c 20 70 4c 69 73 74 21 3d 26 73  ree || pList!=&s
6210: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
6220: 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  t);.#endif..  if
6230: 28 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29  ( pList->pLast )
6240: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d  {.    int iOff =
6250: 20 28 63 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d   (char *)pLink -
6260: 20 28 63 68 61 72 20 2a 29 70 50 67 3b 0a 20 20   (char *)pPg;.  
6270: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a    PagerLruLink *
6280: 70 4c 61 73 74 4c 69 6e 6b 20 3d 20 28 50 61 67  pLastLink = (Pag
6290: 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28  erLruLink *)(&((
62a0: 75 38 20 2a 29 70 4c 69 73 74 2d 3e 70 4c 61 73  u8 *)pList->pLas
62b0: 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70  t)[iOff]);.    p
62c0: 4c 61 73 74 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20  LastLink->pNext 
62d0: 3d 20 70 50 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = pPg;.  }else{.
62e0: 20 20 20 20 61 73 73 65 72 74 28 21 70 4c 69 73      assert(!pLis
62f0: 74 2d 3e 70 46 69 72 73 74 29 3b 0a 20 20 20 20  t->pFirst);.    
6300: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 3d 20  pList->pFirst = 
6310: 70 50 67 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73  pPg;.  }..  pLis
6320: 74 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a  t->pLast = pPg;.
6330: 20 20 69 66 28 20 21 70 4c 69 73 74 2d 3e 70 46    if( !pList->pF
6340: 69 72 73 74 53 79 6e 63 65 64 20 26 26 20 70 50  irstSynced && pP
6350: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
6360: 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  {.    pList->pFi
6370: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b  rstSynced = pPg;
6380: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
6390: 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d 20 74 68  move pPg from th
63a0: 65 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62  e list managed b
63b0: 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  y the structure 
63c0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 4c  pointed to by pL
63d0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ist..**.** Argum
63e0: 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64  ent pLink should
63f0: 20 70 6f 69 6e 74 20 74 6f 20 65 69 74 68 65 72   point to either
6400: 20 70 50 67 2d 3e 66 72 65 65 20 6f 72 20 70 50   pPg->free or pP
6410: 67 2d 3e 67 66 72 65 65 2c 20 64 65 70 65 6e 64  g->gfree, depend
6420: 69 6e 67 20 0a 2a 2a 20 6f 6e 20 77 68 65 74 68  ing .** on wheth
6430: 65 72 20 70 50 67 20 69 73 20 62 65 69 6e 67 20  er pPg is being 
6440: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 61 67  added to the pag
6450: 65 72 2d 73 70 65 63 69 66 69 63 20 6f 72 20 67  er-specific or g
6460: 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 2e 0a  lobal LRU list..
6470: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
6480: 69 73 74 52 65 6d 6f 76 65 28 50 61 67 65 72 4c  istRemove(PagerL
6490: 72 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 50  ruList *pList, P
64a0: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69  agerLruLink *pLi
64b0: 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  nk, PgHdr *pPg){
64c0: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 28 63  .  int iOff = (c
64d0: 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63  har *)pLink - (c
64e0: 68 61 72 20 2a 29 70 50 67 3b 0a 0a 23 69 66 64  har *)pPg;..#ifd
64f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6500: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
6510: 4e 54 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e  NT.  assert(pLin
6520: 6b 3d 3d 26 70 50 67 2d 3e 66 72 65 65 20 7c 7c  k==&pPg->free ||
6530: 20 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66   pLink==&pPg->gf
6540: 72 65 65 29 3b 0a 20 20 61 73 73 65 72 74 28 70  ree);.  assert(p
6550: 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65  Link==&pPg->gfre
6560: 65 20 7c 7c 20 70 4c 69 73 74 21 3d 26 73 71 6c  e || pList!=&sql
6570: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 29  ite3LruPageList)
6580: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
6590: 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72  pPg==pList->pFir
65a0: 73 74 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  st ){.    pList-
65b0: 3e 70 46 69 72 73 74 20 3d 20 70 4c 69 6e 6b 2d  >pFirst = pLink-
65c0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
65d0: 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 4c  ( pPg==pList->pL
65e0: 61 73 74 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ast ){.    pList
65f0: 2d 3e 70 4c 61 73 74 20 3d 20 70 4c 69 6e 6b 2d  ->pLast = pLink-
6600: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
6610: 28 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 29  ( pLink->pPrev )
6620: 7b 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69  {.    PagerLruLi
6630: 6e 6b 20 2a 70 50 72 65 76 4c 69 6e 6b 20 3d 20  nk *pPrevLink = 
6640: 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29  (PagerLruLink *)
6650: 28 26 28 28 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e  (&((u8 *)pLink->
6660: 70 50 72 65 76 29 5b 69 4f 66 66 5d 29 3b 0a 20  pPrev)[iOff]);. 
6670: 20 20 20 70 50 72 65 76 4c 69 6e 6b 2d 3e 70 4e     pPrevLink->pN
6680: 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65  ext = pLink->pNe
6690: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  xt;.  }.  if( pL
66a0: 69 6e 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ink->pNext ){.  
66b0: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a    PagerLruLink *
66c0: 70 4e 65 78 74 4c 69 6e 6b 20 3d 20 28 50 61 67  pNextLink = (Pag
66d0: 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28  erLruLink *)(&((
66e0: 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70 4e 65 78  u8 *)pLink->pNex
66f0: 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70  t)[iOff]);.    p
6700: 4e 65 78 74 4c 69 6e 6b 2d 3e 70 50 72 65 76 20  NextLink->pPrev 
6710: 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a  = pLink->pPrev;.
6720: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 70    }.  if( pPg==p
6730: 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63  List->pFirstSync
6740: 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  ed ){.    PgHdr 
6750: 2a 70 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78  *p = pLink->pNex
6760: 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20  t;.    while( p 
6770: 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
6780: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 4c 72 75  {.      PagerLru
6790: 4c 69 6e 6b 20 2a 70 4c 20 3d 20 28 50 61 67 65  Link *pL = (Page
67a0: 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75  rLruLink *)(&((u
67b0: 38 20 2a 29 70 29 5b 69 4f 66 66 5d 29 3b 0a 20  8 *)p)[iOff]);. 
67c0: 20 20 20 20 20 70 20 3d 20 70 4c 2d 3e 70 4e 65       p = pL->pNe
67d0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  xt;.    }.    pL
67e0: 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ist->pFirstSynce
67f0: 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 70 4c  d = p;.  }..  pL
6800: 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 69  ink->pNext = pLi
6810: 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 7d  nk->pPrev = 0;.}
6820: 0a 0a 2f 2a 20 0a 2a 2a 20 41 64 64 20 70 61 67  ../* .** Add pag
6830: 65 20 70 50 67 20 74 6f 20 74 68 65 20 6c 69 73  e pPg to the lis
6840: 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  t of free pages 
6850: 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 20 49  for the pager. I
6860: 66 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2d 6d 61 6e  f .** memory-man
6870: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
6880: 65 64 2c 20 61 6c 73 6f 20 61 64 64 20 74 68 65  ed, also add the
6890: 20 70 61 67 65 20 74 6f 20 74 68 65 20 67 6c 6f   page to the glo
68a0: 62 61 6c 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20  bal .** list of 
68b0: 66 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 73  free pages..*/.s
68c0: 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69  tatic void lruLi
68d0: 73 74 41 64 64 28 50 67 48 64 72 20 2a 70 50 67  stAdd(PgHdr *pPg
68e0: 29 7b 0a 20 20 6c 69 73 74 41 64 64 28 26 70 50  ){.  listAdd(&pP
68f0: 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20  g->pPager->lru, 
6900: 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67 29  &pPg->free, pPg)
6910: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6920: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
6930: 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
6940: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d  pPg->pPager->mem
6950: 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Db ){.    sqlite
6960: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
6970: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
6980: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6990: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20  TATIC_LRU));.   
69a0: 20 6c 69 73 74 41 64 64 28 26 73 71 6c 69 74 65   listAdd(&sqlite
69b0: 33 4c 72 75 50 61 67 65 4c 69 73 74 2c 20 26 70  3LruPageList, &p
69c0: 50 67 2d 3e 67 66 72 65 65 2c 20 70 50 67 29 3b  Pg->gfree, pPg);
69d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
69e0: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
69f0: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
6a00: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
6a10: 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  _LRU));.  }.#end
6a20: 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 6d  if.}../* .** Rem
6a30: 6f 76 65 20 70 61 67 65 20 70 50 67 20 66 72 6f  ove page pPg fro
6a40: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72  m the list of fr
6a50: 65 65 20 70 61 67 65 73 20 66 6f 72 20 74 68 65  ee pages for the
6a60: 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 67 65   associated page
6a70: 72 2e 0a 2a 2a 20 49 66 20 6d 65 6d 6f 72 79 2d  r..** If memory-
6a80: 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
6a90: 61 62 6c 65 64 2c 20 61 6c 73 6f 20 72 65 6d 6f  abled, also remo
6aa0: 76 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20  ve pPg from the 
6ab0: 67 6c 6f 62 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f  global list.** o
6ac0: 66 20 66 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f  f free pages..*/
6ad0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75  .static void lru
6ae0: 4c 69 73 74 52 65 6d 6f 76 65 28 50 67 48 64 72  ListRemove(PgHdr
6af0: 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73 74 52 65   *pPg){.  listRe
6b00: 6d 6f 76 65 28 26 70 50 67 2d 3e 70 50 61 67 65  move(&pPg->pPage
6b10: 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72  r->lru, &pPg->fr
6b20: 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65 66  ee, pPg);.#ifdef
6b30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
6b40: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
6b50: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50 61  .  if( !pPg->pPa
6b60: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
6b70: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6b80: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75  enter(sqlite3_mu
6b90: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
6ba0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
6bb0: 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 52 65 6d  U));.    listRem
6bc0: 6f 76 65 28 26 73 71 6c 69 74 65 33 4c 72 75 50  ove(&sqlite3LruP
6bd0: 61 67 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67  ageList, &pPg->g
6be0: 66 72 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20  free, pPg);.    
6bf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
6c00: 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ave(sqlite3_mute
6c10: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
6c20: 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29  UTEX_STATIC_LRU)
6c30: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
6c40: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
6c50: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
6c60: 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20 6e  just after the n
6c70: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 68 61 73  eedSync flag has
6c80: 20 62 65 65 6e 20 63 6c 65 61 72 65 64 0a 2a 2a   been cleared.**
6c90: 20 66 72 6f 6d 20 61 6c 6c 20 70 61 67 65 73 20   from all pages 
6ca0: 6d 61 6e 61 67 65 64 20 62 79 20 70 50 61 67 65  managed by pPage
6cb0: 72 20 28 75 73 75 61 6c 6c 79 20 62 65 63 61 75  r (usually becau
6cc0: 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
6cd0: 69 6c 65 0a 2a 2a 20 68 61 73 20 6a 75 73 74 20  ile.** has just 
6ce0: 62 65 65 6e 20 73 79 6e 63 65 64 29 2e 20 49 74  been synced). It
6cf0: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 50 61   updates the pPa
6d00: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
6d10: 79 6e 63 65 64 20 76 61 72 69 61 62 6c 65 0a 2a  ynced variable.*
6d20: 2a 20 61 6e 64 2c 20 69 66 20 6d 65 6d 6f 72 79  * and, if memory
6d30: 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65  -management is e
6d40: 6e 61 62 6c 65 64 2c 20 74 68 65 20 73 71 6c 69  nabled, the sqli
6d50: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70  te3LruPageList.p
6d60: 46 69 72 73 74 53 79 6e 63 65 64 0a 2a 2a 20 76  FirstSynced.** v
6d70: 61 72 69 61 62 6c 65 20 61 6c 73 6f 2e 0a 2a 2f  ariable also..*/
6d80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75  .static void lru
6d90: 4c 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63  ListSetFirstSync
6da0: 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
6db0: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6c 72 75  ){.  pPager->lru
6dc0: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  .pFirstSynced = 
6dd0: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
6de0: 73 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  st;.#ifdef SQLIT
6df0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
6e00: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28  MANAGEMENT.  if(
6e10: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
6e20: 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
6e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
6e40: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
6e50: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
6e60: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
6e70: 5f 4c 52 55 29 29 3b 0a 20 20 20 20 66 6f 72 28  _LRU));.    for(
6e80: 70 3d 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  p=sqlite3LruPage
6e90: 4c 69 73 74 2e 70 46 69 72 73 74 3b 20 70 20 26  List.pFirst; p &
6ea0: 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 3b 20 70  & p->needSync; p
6eb0: 3d 70 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 29  =p->gfree.pNext)
6ec0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 3d 3d  ;.    assert(p==
6ed0: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
6ee0: 73 74 53 79 6e 63 65 64 20 7c 7c 20 70 3d 3d 73  stSynced || p==s
6ef0: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
6f00: 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 29 3b  t.pFirstSynced);
6f10: 0a 20 20 20 20 73 71 6c 69 74 65 33 4c 72 75 50  .    sqlite3LruP
6f20: 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79  ageList.pFirstSy
6f30: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 73 71  nced = p;.    sq
6f40: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
6f50: 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e(sqlite3_mutex_
6f60: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
6f70: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6f80: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
6f90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
6fa0: 20 69 66 20 70 61 67 65 20 2a 70 50 67 20 68 61   if page *pPg ha
6fb0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
6fc0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74  ritten to the st
6fd0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e  atement.** journ
6fe0: 61 6c 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  al (or statement
6ff0: 20 73 6e 61 70 73 68 6f 74 20 68 61 73 20 62 65   snapshot has be
7000: 65 6e 20 63 72 65 61 74 65 64 2c 20 69 66 20 2a  en created, if *
7010: 70 50 67 20 69 73 20 70 61 72 74 0a 2a 2a 20 6f  pPg is part.** o
7020: 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  f an in-memory d
7030: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
7040: 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 53 74  tic int pageInSt
7050: 61 74 65 6d 65 6e 74 28 50 67 48 64 72 20 2a 70  atement(PgHdr *p
7060: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
7070: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7080: 65 72 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  er;.  if( MEMDB 
7090: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 50 47  ){.    return PG
70a0: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
70b0: 20 70 50 61 67 65 72 29 2d 3e 69 6e 53 74 6d 74   pPager)->inStmt
70c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
70d0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
70e0: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
70f0: 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67  pInStmt, pPg->pg
7100: 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
7110: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
7120: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68  e of the pager h
7130: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20  ash table to N. 
7140: 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77   N must be a pow
7150: 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f  er.** of two..*/
7160: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7170: 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
7180: 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  able(Pager *pPag
7190: 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67  er, int N){.  Pg
71a0: 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50  Hdr **aHash, *pP
71b0: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30  g;.  assert( N>0
71c0: 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30   && (N&(N-1))==0
71d0: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
71e0: 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49  E_MALLOC_SOFT_LI
71f0: 4d 49 54 0a 20 20 69 66 28 20 4e 2a 73 69 7a 65  MIT.  if( N*size
7200: 6f 66 28 61 48 61 73 68 5b 30 5d 29 3e 53 51 4c  of(aHash[0])>SQL
7210: 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f  ITE_MALLOC_SOFT_
7220: 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 4e 20 3d  LIMIT ){.    N =
7230: 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53   SQLITE_MALLOC_S
7240: 4f 46 54 5f 4c 49 4d 49 54 2f 73 69 7a 65 6f 66  OFT_LIMIT/sizeof
7250: 28 61 48 61 73 68 5b 30 5d 29 3b 0a 20 20 7d 0a  (aHash[0]);.  }.
7260: 20 20 69 66 28 20 4e 3d 3d 70 50 61 67 65 72 2d    if( N==pPager-
7270: 3e 6e 48 61 73 68 20 29 20 72 65 74 75 72 6e 3b  >nHash ) return;
7280: 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 4c  .#endif.  pagerL
7290: 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
72a0: 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65 6e 69  sqlite3FaultBeni
72b0: 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54 49  gn(SQLITE_FAULTI
72c0: 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 2c 20  NJECTOR_MALLOC, 
72d0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 21 3d 30  pPager->aHash!=0
72e0: 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71 6c  );.  aHash = sql
72f0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
7300: 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29  sizeof(aHash[0])
7310: 2a 4e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  *N );.  sqlite3F
7320: 61 75 6c 74 42 65 6e 69 67 6e 28 53 51 4c 49 54  aultBenign(SQLIT
7330: 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f  E_FAULTINJECTOR_
7340: 4d 41 4c 4c 4f 43 2c 20 30 29 3b 0a 20 20 70 61  MALLOC, 0);.  pa
7350: 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
7360: 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d 3d 30  ;.  if( aHash==0
7370: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75   ){.    /* Failu
7380: 72 65 20 74 6f 20 72 65 68 61 73 68 20 69 73 20  re to rehash is 
7390: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 49  not an error.  I
73a0: 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65 72 66  t is only a perf
73b0: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a  ormance hit. */.
73c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
73d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
73e0: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
73f0: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
7400: 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   N;.  pPager->aH
7410: 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66  ash = aHash;.  f
7420: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
7430: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
7440: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
7450: 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28    int h;.    if(
7460: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
7470: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7480: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
7490: 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
74a0: 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  sh==0 );.      c
74b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
74c0: 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f     h = pPg->pgno
74d0: 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50   & (N-1);.    pP
74e0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61  g->pNextHash = a
74f0: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28  Hash[h];.    if(
7500: 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20   aHash[h] ){.   
7510: 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72     aHash[h]->pPr
7520: 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
7530: 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d    }.    aHash[h]
7540: 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d   = pPg;.    pPg-
7550: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
7560: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
7570: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
7580: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
7590: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
75a0: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
75b0: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
75c0: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
75d0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
75e0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
75f0: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
7600: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
7610: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
7620: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
7630: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
7640: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
7650: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
7660: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
7670: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
7680: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
7690: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
76a0: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
76b0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
76c0: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
76d0: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f  c, sizeof(ac), o
76e0: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
76f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7700: 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74     *pRes = sqlit
7710: 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a  e3Get4byte(ac);.
7720: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
7740: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
7750: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
7760: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
7770: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
7780: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32  */.#define put32
7790: 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74  bits(A,B)  sqlit
77a0: 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29  e3Put4byte((u8*)
77b0: 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  A,B)../*.** Writ
77c0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
77d0: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
77e0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
77f0: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
7800: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
7810: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
7820: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
7830: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
7840: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
7850: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
7860: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
7870: 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20  set, u32 val){. 
7880: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70   char ac[4];.  p
7890: 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c  ut32bits(ac, val
78a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
78b0: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
78c0: 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d  c, 4, offset);.}
78d0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20  ../*.** If file 
78e0: 70 46 64 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c  pFd is open, cal
78f0: 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  l sqlite3OsUnloc
7900: 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74  k() on it..*/.st
7910: 61 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63  atic int osUnloc
7920: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
7930: 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  pFd, int eLock){
7940: 0a 20 20 69 66 28 20 21 70 46 64 2d 3e 70 4d 65  .  if( !pFd->pMe
7950: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74  thods ){.    ret
7960: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
7970: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
7980: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c  te3OsUnlock(pFd,
7990: 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   eLock);.}../*.*
79a0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
79b0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
79c0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74  er or not the at
79d0: 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
79e0: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ization.** can b
79f0: 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73  e used with this
7a00: 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69   pager. The opti
7a10: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
7a20: 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  used if:.**.**  
7a30: 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (a) the value re
7a40: 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69  turned by OsDevi
7a50: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
7a60: 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68  s() indicates th
7a70: 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74  at.**      a dat
7a80: 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62  abase page may b
7a90: 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
7aa0: 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62  ally, and.**  (b
7ab0: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
7ac0: 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72  rned by OsSector
7ad0: 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74  Size() is less t
7ae0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
7af0: 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65       to the page
7b00: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
7b10: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
7b20: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
7b30: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
7b40: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
7b50: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
7b60: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
7b70: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
7b80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
7b90: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
7ba0: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
7bb0: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
7bc0: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
7bd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
7be0: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
7bf0: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
7c00: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
7c10: 65 72 29 7b 0a 20 20 69 6e 74 20 64 63 3b 20 20  er){.  int dc;  
7c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
7c30: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
7c40: 63 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 63  cs */.  int nSec
7c50: 74 6f 72 3b 20 20 20 20 20 20 2f 2a 20 53 65 63  tor;      /* Sec
7c60: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e  tor size */.  in
7c70: 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
7c80: 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a  /* Page size */.
7c90: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7ca0: 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b  fd = pPager->fd;
7cb0: 0a 0a 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74  ..  if( fd->pMet
7cc0: 68 6f 64 73 20 29 7b 0a 20 20 20 20 64 63 20 3d  hods ){.    dc =
7cd0: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
7ce0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
7cf0: 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72  fd);.    nSector
7d00: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
7d10: 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 20 20  orSize(fd);.    
7d20: 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  nPage = pPager->
7d30: 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  pageSize;.  }.. 
7d40: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
7d50: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
7d60: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73 73  (512>>8));.  ass
7d70: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
7d80: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
7d90: 33 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28 20  36>>8));..  if( 
7da0: 21 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c 7c  !fd->pMethods ||
7db0: 20 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   (dc&(SQLITE_IOC
7dc0: 41 50 5f 41 54 4f 4d 49 43 7c 28 6e 50 61 67 65  AP_ATOMIC|(nPage
7dd0: 3e 3e 38 29 29 26 26 6e 53 65 63 74 6f 72 3c 3d  >>8))&&nSector<=
7de0: 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 72 65  nPage) ){.    re
7df0: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
7e00: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
7e10: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
7e20: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
7e30: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
7e40: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
7e50: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  on should be cal
7e60: 6c 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f  led when an erro
7e70: 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
7e80: 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64  the pager.** cod
7e90: 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  e. The first arg
7ea0: 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
7eb0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20  er to the pager 
7ec0: 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a  structure, the.*
7ed0: 2a 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72  * second the err
7ee0: 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
7ef0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
7f00: 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
7f10: 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61  tion. .** The va
7f20: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
7f30: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
7f40: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
7f50: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
7f60: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
7f70: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
7f80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
7f90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
7fa0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a  r SQLITE_FULL.**
7fb0: 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d   the error becom
7fc0: 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55  es persistent. U
7fd0: 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74  ntil the persist
7fe0: 65 6e 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61  en error is clea
7ff0: 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65  red,.** subseque
8000: 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  nt API calls on 
8010: 74 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20  this Pager will 
8020: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
8030: 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  rn the same .** 
8040: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
8050: 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65  * A persistent e
8060: 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74  rror indicates t
8070: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
8080: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
8090: 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
80a0: 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
80b0: 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
80c0: 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
80d0: 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
80e0: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
80f0: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
8100: 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
8110: 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
8120: 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
8130: 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
8140: 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
8150: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
8160: 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
8170: 20 72 65 70 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74   replayed..*/.st
8180: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
8190: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
81a0: 61 67 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e  ager);.static in
81b0: 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
81c0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
81d0: 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
81e0: 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
81f0: 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
8200: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
8210: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
8220: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
8230: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
8240: 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
8250: 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
8260: 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
8270: 0a 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20  .  );.  if(.    
8280: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  rc2==SQLITE_FULL
8290: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
82a0: 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20  ITE_IOERR ||.   
82b0: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52   rc2==SQLITE_COR
82c0: 52 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50  RUPT.  ){.    pP
82d0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
82e0: 72 63 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  rc;.    if( pPag
82f0: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
8300: 5f 55 4e 4c 4f 43 4b 20 26 26 20 70 50 61 67 65  _UNLOCK && pPage
8310: 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
8320: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
8330: 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 75  ger is already u
8340: 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61  nlocked, call pa
8350: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77  ger_unlock() now
8360: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   to.      ** cle
8370: 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
8380: 74 65 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68  te and ensure th
8390: 61 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  at the pager-cac
83a0: 68 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  he is .      ** 
83b0: 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
83c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
83d0: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
83e0: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
83f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8400: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  ./*.** If SQLITE
8410: 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20  _CHECK_PAGES is 
8420: 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20  defined then we 
8430: 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63  do some sanity c
8440: 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  hecking.** on th
8450: 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20  e cache using a 
8460: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20  hash function.  
8470: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
8480: 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20   testing.** and 
8490: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
84a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
84b0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
84c0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
84d0: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
84e0: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
84f0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
8500: 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  2 pager_datahash
8510: 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69  (int nByte, unsi
8520: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
8530: 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20  ){.  u32 hash = 
8540: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
8550: 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20  r(i=0; i<nByte; 
8560: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
8570: 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70   (hash*1039) + p
8580: 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72  Data[i];.  }.  r
8590: 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74  eturn hash;.}.st
85a0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70  atic u32 pager_p
85b0: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
85c0: 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
85d0: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
85e0: 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61  Page->pPager->pa
85f0: 67 65 53 69 7a 65 2c 20 0a 20 20 20 20 20 20 20  geSize, .       
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8610: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
8620: 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
8630: 70 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPage));.}../*.*
8640: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
8650: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
8660: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
8670: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
8680: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
8690: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
86a0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
86b0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
86c0: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
86d0: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
86e0: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
86f0: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
8700: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
8710: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
8720: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
8730: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
8740: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
8750: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
8760: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
8770: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
8780: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
8790: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
87a0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
87b0: 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70  de || MEMDB || p
87c0: 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20  Pg->dirty || .  
87d0: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
87e0: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
87f0: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
8800: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
8810: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
8820: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
8830: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
8840: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
8850: 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E(x).#endif../*.
8860: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
8870: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
8880: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
8890: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
88a0: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61   open..** The ma
88b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
88c0: 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66  e name is read f
88d0: 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74  rom the end of t
88e0: 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20  he file and .** 
88f0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d  written into mem
8900: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 62 79 20  ory supplied by 
8910: 74 68 65 20 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a  the caller. .**.
8920: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
8930: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
8940: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
8950: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
8960: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
8970: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
8980: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
8990: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
89a0: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
89b0: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
89c0: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
89d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
89e0: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
89f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
8a00: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
8a10: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
8a20: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
8a30: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
8a40: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
8a50: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
8a60: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
8a70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
8a80: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
8a90: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
8aa0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  al..**.** If no 
8ab0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8ac0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
8ad0: 65 6e 74 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69  ent zMaster[0] i
8ae0: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
8af0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
8b00: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
8b10: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
8b20: 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69  urnal(sqlite3_fi
8b30: 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20  le *pJrnl, char 
8b40: 2a 7a 4d 61 73 74 65 72 2c 20 69 6e 74 20 6e 4d  *zMaster, int nM
8b50: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
8b60: 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69  ;.  u32 len;.  i
8b70: 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b  64 szJ;.  u32 ck
8b80: 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  sum;.  int i;.  
8b90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
8ba0: 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75  agic[8]; /* A bu
8bb0: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
8bc0: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
8bd0: 0a 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  ..  zMaster[0] =
8be0: 20 27 5c 30 27 3b 0a 0a 20 20 72 63 20 3d 20 73   '\0';..  rc = s
8bf0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
8c00: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20  (pJrnl, &szJ);. 
8c10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8c20: 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72  OK || szJ<16 ) r
8c30: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8c40: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
8c50: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
8c60: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8c70: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
8c80: 72 63 3b 0a 0a 20 20 69 66 28 20 6c 65 6e 3e 3d  rc;..  if( len>=
8c90: 6e 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  nMaster ){.    r
8ca0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8cb0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
8cc0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
8cd0: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 3b 0a  zJ-12, &cksum);.
8ce0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8cf0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
8d00: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
8d10: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
8d20: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b  agic, 8, szJ-8);
8d30: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8d40: 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  E_OK || memcmp(a
8d50: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
8d60: 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72  agic, 8) ) retur
8d70: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
8d80: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
8d90: 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c  l, zMaster, len,
8da0: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20   szJ-16-len);.  
8db0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8dc0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
8dd0: 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  rc;.  }.  zMaste
8de0: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 0a  r[len] = '\0';..
8df0: 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20    /* See if the 
8e00: 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73  checksum matches
8e10: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8e20: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f  nal name */.  fo
8e30: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
8e40: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d  +){.    cksum -=
8e50: 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 20   zMaster[i];.   
8e60: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
8e70: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
8e80: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
8e90: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
8ea0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
8eb0: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
8ec0: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
8ed0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8ee0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
8ef0: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
8f00: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
8f10: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
8f20: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
8f30: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
8f40: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
8f50: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
8f60: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
8f70: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 5b   */.    zMaster[
8f80: 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  0] = '\0';.  }. 
8f90: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
8fa0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
8fb0: 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Seek the journal
8fc0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8fd0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
8fe0: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65  tor boundary whe
8ff0: 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  re a.** journal 
9000: 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65  header may be re
9010: 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50  ad or written. P
9020: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
9030: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a  is updated with.
9040: 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20  ** the new seek 
9050: 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e  offset..**.** i.
9060: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
9070: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
9080: 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20  * Input Offset  
9090: 20 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70              Outp
90a0: 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d  ut Offset.** ---
90b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90d0: 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20  ----.** 0       
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90f0: 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20    0.** 512      
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20   512.** 100     
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9130: 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20    512.** 2000   
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
9160: 74 61 74 69 63 20 76 6f 69 64 20 73 65 65 6b 4a  tatic void seekJ
9170: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
9180: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
9190: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
91a0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
91b0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
91c0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
91d0: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
91e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
91f0: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
9200: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
9210: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
9220: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
9230: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
9240: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
9250: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
9260: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
9270: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
9280: 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  er) );.  pPager-
9290: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66  >journalOff = of
92a0: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
92b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
92c0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
92d0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
92e0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
92f0: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
9300: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
9310: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
9320: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
9330: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
9340: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
9350: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
9360: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
9370: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
9380: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
9390: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
93a0: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
93b0: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
93c0: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
93d0: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
93e0: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
93f0: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
9400: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
9410: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
9420: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
9430: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
9440: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
9450: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
9460: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
9470: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
9480: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
9490: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
94a0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
94b0: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
94c0: 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20  _SZ - 24) bytes 
94d0: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
94e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
94f0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
9500: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
9510: 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69   char zHeader[si
9520: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
9530: 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e 74 20 72  ic)+16];.  int r
9540: 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
9550: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20  ->stmtHdrOff==0 
9560: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
9570: 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67  tmtHdrOff = pPag
9580: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
9590: 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e    }..  seekJourn
95a0: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
95b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
95c0: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
95d0: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d  urnalOff;..  mem
95e0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
95f0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
9600: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
9610: 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  ));..  /* .  ** 
9620: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
9630: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
9640: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
9650: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
9660: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
9670: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
9680: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
9690: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
96a0: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
96b0: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
96c0: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
96d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
96e0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
96f0: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
9700: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
9710: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
9720: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
9730: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
9740: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
9750: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
9760: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
9770: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
9780: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
9790: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
97a0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
97b0: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
97c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
97d0: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
97e0: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
97f0: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
9800: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
9810: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
9820: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
9830: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
9840: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
9850: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
9860: 69 6c 75 72 65 20 6f 63 63 75 72 65 64 20 77 68  ilure occured wh
9870: 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20  ilst writing to 
9880: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
9890: 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e   file it may con
98a0: 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67  tain some garbag
98b0: 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72  e data. There ar
98c0: 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a  e two scenarios.
98d0: 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20    ** where this 
98e0: 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f  risk can be igno
98f0: 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  red:.  **.  **  
9900: 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65   * When the page
9910: 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  r is in no-sync 
9920: 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e  mode. Corruption
9930: 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20   can follow a.  
9940: 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69  **     power fai
9950: 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73  lure in this cas
9960: 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20  e anyway..  **. 
9970: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
9980: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
9990: 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69  FE_APPEND flag i
99a0: 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72  s set. This guar
99b0: 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20  antees.  **     
99c0: 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74  that garbage dat
99d0: 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e  a is never appen
99e0: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
99f0: 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  al file..  */.  
9a00: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
9a10: 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
9a20: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20  ger->noSync);.  
9a30: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  if( (pPager->noS
9a40: 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28 73 71 6c  ync) .   || (sql
9a50: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
9a60: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
9a70: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
9a80: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
9a90: 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75 74 33  ) .  ){.    put3
9aa0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
9ab0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9ac0: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
9ad0: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
9ae0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
9af0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
9b00: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a  nalMagic)], 0);.
9b10: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
9b20: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
9b30: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
9b40: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
9b50: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
9b60: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
9b70: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
9b80: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
9b90: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
9ba0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
9bb0: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
9bc0: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
9bd0: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
9be0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
9bf0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
9c00: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9c10: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
9c20: 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  >dbSize);.  /* T
9c30: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
9c40: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
9c50: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
9c60: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
9c70: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9c80: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
9c90: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
9ca0: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
9cb0: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
9cc0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
9cd0: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65  journalHdr, size
9ce0: 6f 66 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20  of(zHeader))).  
9cf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
9d00: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
9d10: 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66   zHeader, sizeof
9d20: 28 7a 48 65 61 64 65 72 29 2c 70 50 61 67 65 72  (zHeader),pPager
9d30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
9d40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9d50: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
9d60: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a  DR_SZ(pPager);..
9d70: 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
9d80: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
9d90: 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73 73   written success
9da0: 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20  fully. Seek the 
9db0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
9dc0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
9dd0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
9de0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
9df0: 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ctor..  */.  if(
9e00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
9e10: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
9e20: 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22  JTAIL %p %lld\n"
9e30: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
9e40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29  ->journalOff-1))
9e50: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9e60: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
9e70: 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 2c  >jfd, "\000", 1,
9e80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9e90: 4f 66 66 2d 31 29 3b 0a 20 20 7d 0a 20 20 72 65  Off-1);.  }.  re
9ea0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9eb0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
9ec0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
9ed0: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
9ee0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
9ef0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
9f00: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
9f10: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
9f20: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
9f30: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
9f40: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53  urnal.** file. S
9f50: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
9f60: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
9f70: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
9f80: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
9f90: 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  f.** the journal
9fa0: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
9fb0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
9fc0: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
9fd0: 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20  essfully, *nRec 
9fe0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
9ff0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
a000: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
a010: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
a020: 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74  d *dbSize is set
a030: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
a040: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
a050: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
a060: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
a070: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
a080: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
a090: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
a0a0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
a0b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
a0c0: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
a0d0: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
a0e0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
a0f0: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
a100: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
a110: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
a120: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
a130: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
a140: 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a   and *nRec and *
a150: 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73  dbSize are not s
a160: 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  et.  If JOURNAL_
a170: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
a180: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
a190: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a1a0: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
a1b0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
a1c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
a1d0: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
a1e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a  Pager *pPager, .
a1f0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
a200: 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c  e,.  u32 *pNRec,
a210: 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65   .  u32 *pDbSize
a220: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
a230: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
a240: 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75  agic[8]; /* A bu
a250: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
a260: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
a270: 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a  .  i64 jrnlOff;.
a280: 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  .  seekJournalHd
a290: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
a2a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a2b0: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
a2c0: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
a2d0: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
a2e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
a2f0: 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66  NE;.  }.  jrnlOf
a300: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
a310: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20  nalOff;..  rc = 
a320: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
a330: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
a340: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
a350: 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69  ), jrnlOff);.  i
a360: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a370: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
a380: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a  sizeof(aMagic);.
a390: 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  .  if( memcmp(aM
a3a0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
a3b0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
a3c0: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ic))!=0 ){.    r
a3d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
a3e0: 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  E;.  }..  rc = r
a3f0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
a400: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20  ->jfd, jrnlOff, 
a410: 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63  pNRec);.  if( rc
a420: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
a430: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
a440: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
a450: 6e 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67 65 72  nlOff+4, &pPager
a460: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
a470: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
a480: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
a490: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
a4a0: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70  fd, jrnlOff+8, p
a4b0: 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  DbSize);.  if( r
a4c0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
a4d0: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
a4e0: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
a4f0: 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
a500: 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
a510: 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
a520: 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68   that created th
a530: 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  is journal. If t
a540: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  his journal was.
a550: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
a560: 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
a570: 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
a580: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
a590: 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63  .  ** is being c
a5a0: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
a5b0: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
a5c0: 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
a5d0: 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65  lue.  ** of Page
a5e0: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
a5f0: 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
a600: 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
a610: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ine..  */.  rc =
a620: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
a630: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
a640: 2b 31 32 2c 20 28 75 33 32 20 2a 29 26 70 50 61  +12, (u32 *)&pPa
a650: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
a660: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
a670: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65  urn rc;..  pPage
a680: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
a690: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
a6a0: 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
a6b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
a6c0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
a6d0: 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
a6e0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
a6f0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
a700: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
a710: 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
a720: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
a730: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
a740: 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
a750: 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
a760: 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
a770: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
a780: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
a790: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
a7a0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
a7b0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
a7c0: 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
a7d0: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
a7e0: 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
a7f0: 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
a800: 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
a810: 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20  t is:.**.** + 4 
a820: 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
a830: 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74  PGNO..** + N byt
a840: 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61  es: length of ma
a850: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
a860: 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  e..** + 4 bytes:
a870: 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a   N.** + 4 bytes:
a880: 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
a890: 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  name checksum..*
a8a0: 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f  * + 8 bytes: aJo
a8b0: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
a8c0: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
a8d0: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
a8e0: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
a8f0: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
a900: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
a910: 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a  urnal name..**.*
a920: 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20  * If zMaster is 
a930: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28  a NULL pointer (
a940: 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e  occurs for a sin
a950: 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
a960: 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74  nsaction), .** t
a970: 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
a980: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
a990: 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  nt writeMasterJo
a9a0: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
a9b0: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
a9c0: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
a9d0: 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20   rc;.  int len; 
a9e0: 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 69 36 34  .  int i; .  i64
a9f0: 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75 33 32 20   jrnlOff;.  u32 
aa00: 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61  cksum = 0;.  cha
aa10: 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a  r zBuf[sizeof(aJ
aa20: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34  ournalMagic)+2*4
aa30: 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  ];..  if( !zMast
aa40: 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65  er || pPager->se
aa50: 74 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e 20  tMaster) return 
aa60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
aa70: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
aa80: 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72   1;..  len = str
aa90: 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  len(zMaster);.  
aaa0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20  for(i=0; i<len; 
aab0: 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  i++){.    cksum 
aac0: 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20  += zMaster[i];. 
aad0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
aae0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
aaf0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
ab00: 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
ab10: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
ab20: 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
ab30: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
ab40: 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
ab50: 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
ab60: 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
ab70: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
ab80: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
ab90: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
aba0: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
abb0: 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61  {.    seekJourna
abc0: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
abd0: 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50  }.  jrnlOff = pP
abe0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
abf0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
ac00: 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32  nalOff += (len+2
ac10: 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  0);..  rc = writ
ac20: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
ac30: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41  jfd, jrnlOff, PA
ac40: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
ac50: 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  er));.  if( rc!=
ac60: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
ac70: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
ac80: 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73   += 4;..  rc = s
ac90: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
aca0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
acb0: 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66  er, len, jrnlOff
acc0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
acd0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
ace0: 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d  rc;.  jrnlOff +=
acf0: 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69   len;..  put32bi
ad00: 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20  ts(zBuf, len);. 
ad10: 20 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66   put32bits(&zBuf
ad20: 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d  [4], cksum);.  m
ad30: 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20  emcpy(&zBuf[8], 
ad40: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
ad50: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
ad60: 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  gic));.  rc = sq
ad70: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
ad80: 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20  ger->jfd, zBuf, 
ad90: 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  8+sizeof(aJourna
ada0: 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66  lMagic), jrnlOff
adb0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  );.  pPager->nee
adc0: 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
add0: 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72  >noSync;.  retur
ade0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
adf0: 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70  dd or remove a p
ae00: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  age from the lis
ae10: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74  t of all pages t
ae20: 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a  hat are in the.*
ae30: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  * statement jour
ae40: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  nal..**.** The P
ae50: 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70  ager keeps a sep
ae60: 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61  arate list of pa
ae70: 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ges that are cur
ae80: 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65  rently in.** the
ae90: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
aea0: 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  al.  This helps 
aeb0: 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
aec0: 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20  StmtCommit().** 
aed0: 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48  routine run MUCH
aee0: 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20   faster for the 
aef0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
af00: 65 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79  e there are many
af10: 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d  .** pages in mem
af20: 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66  ory but only a f
af30: 65 77 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ew are in the st
af40: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
af50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
af60: 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
af70: 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67  _list(PgHdr *pPg
af80: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
af90: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
afa0: 3b 0a 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70  ;.  PgHistory *p
afb0: 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
afc0: 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
afd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d  );.  assert( MEM
afe0: 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 48 69  DB );.  if( !pHi
aff0: 73 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20  st->inStmt ){.  
b000: 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
b010: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26  >pPrevStmt==0 &&
b020: 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
b030: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  t==0 );.    if( 
b040: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b  pPager->pStmt ){
b050: 0a 20 20 20 20 20 20 50 47 48 44 52 5f 54 4f 5f  .      PGHDR_TO_
b060: 48 49 53 54 28 70 50 61 67 65 72 2d 3e 70 53 74  HIST(pPager->pSt
b070: 6d 74 2c 20 70 50 61 67 65 72 29 2d 3e 70 50 72  mt, pPager)->pPr
b080: 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  evStmt = pPg;.  
b090: 20 20 7d 0a 20 20 20 20 70 48 69 73 74 2d 3e 70    }.    pHist->p
b0a0: 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65  NextStmt = pPage
b0b0: 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 70 50  r->pStmt;.    pP
b0c0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
b0d0: 67 3b 0a 20 20 20 20 70 48 69 73 74 2d 3e 69 6e  g;.    pHist->in
b0e0: 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Stmt = 1;.  }.}.
b0f0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61  ./*.** Find a pa
b100: 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ge in the hash t
b110: 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70  able given its p
b120: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  age number.  Ret
b130: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
b140: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
b150: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
b160: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  d..*/.static PgH
b170: 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  dr *pager_lookup
b180: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b190: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
b1a0: 48 64 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 50  Hdr *p;.  if( pP
b1b0: 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29  ager->aHash==0 )
b1c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d   return 0;.  p =
b1d0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
b1e0: 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
b1f0: 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c  Hash-1)];.  whil
b200: 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21  e( p && p->pgno!
b210: 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d  =pgno ){.    p =
b220: 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20   p->pNextHash;. 
b230: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
b240: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
b250: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
b260: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
b270: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61  .** sets the sta
b280: 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
b290: 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20  back to what it 
b2a0: 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20  was when it was 
b2b0: 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e  first.** opened.
b2c0: 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e    Any outstandin
b2d0: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
b2e0: 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73  lidated and subs
b2f0: 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a  equent attempts.
b300: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f  ** to access tho
b310: 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69  se pages will li
b320: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
b330: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74   coredump..*/.st
b340: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
b350: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
b360: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
b370: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66  Pg, *pNext;.  if
b380: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
b390: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
b3a0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
b3b0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
b3c0: 78 74 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  xt){.    IOTRACE
b3d0: 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c  (("PGFREE %p %d\
b3e0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
b3f0: 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47  >pgno));.    PAG
b400: 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
b410: 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75  pager_pgfree_cou
b420: 6e 74 29 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d  nt);.    pNext =
b430: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
b440: 20 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76      lruListRemov
b450: 65 28 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69  e(pPg);.    sqli
b460: 74 65 33 5f 66 72 65 65 28 70 50 67 2d 3e 70 44  te3_free(pPg->pD
b470: 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ata);.    sqlite
b480: 33 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 7d  3_free(pPg);.  }
b490: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
b4a0: 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30 29  ->lru.pFirst==0)
b4b0: 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
b4c0: 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e  r->lru.pFirstSyn
b4d0: 63 65 64 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72  ced==0);.  asser
b4e0: 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 4c  t(pPager->lru.pL
b4f0: 61 73 74 3d 3d 30 29 3b 0a 20 20 70 50 61 67 65  ast==0);.  pPage
b500: 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
b510: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30  pPager->pAll = 0
b520: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72  ;.  pPager->pDir
b530: 74 79 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ty = 0;.  pPager
b540: 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73  ->nHash = 0;.  s
b550: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
b560: 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50  er->aHash);.  pP
b570: 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
b580: 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  .  pPager->aHash
b590: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
b5a0: 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nRef = 0;.}../*.
b5b0: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
b5c0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a  tabase file. .**
b5d0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
b5e0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
b5f0: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69   error state, di
b600: 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
b610: 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61  ts of .** the ca
b620: 63 68 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  che and reset th
b630: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
b640: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
b650: 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  . If there is.**
b660: 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   an open journal
b670: 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  -file, then the 
b680: 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68 61 72  next time a shar
b690: 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ed-lock is obtai
b6a0: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61  ned.** on the pa
b6b0: 67 65 72 20 66 69 6c 65 20 28 62 79 20 74 68 69  ger file (by thi
b6c0: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
b6d0: 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c  rocess), it will
b6e0: 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61   be.** treated a
b6f0: 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
b700: 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  and rolled back.
b710: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b720: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
b730: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
b740: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
b750: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
b760: 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
b770: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73       int rc = os
b780: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
b790: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
b7a0: 20 20 20 69 66 28 20 72 63 20 29 20 70 50 61 67     if( rc ) pPag
b7b0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
b7c0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
b7d0: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20  dbSize = -1;.   
b7e0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c     IOTRACE(("UNL
b7f0: 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OCK %p\n", pPage
b800: 72 29 29 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  r))..      /* If
b810: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
b820: 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
b830: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
b840: 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
b850: 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 73 74 65  .      ** truste
b860: 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20  d. Now that the 
b870: 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e  pager file is un
b880: 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74  locked, the cont
b890: 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
b8a0: 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62    ** cache can b
b8b0: 65 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20  e discarded and 
b8c0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73  the error code s
b8d0: 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20  afely cleared.. 
b8e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
b8f0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
b900: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
b910: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b920: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
b930: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b940: 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
b950: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
b960: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
b970: 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  tmtOpen ){.     
b980: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
b990: 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ose(pPager->stfd
b9a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
b9b0: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
b9c0: 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  y(pPager->pInStm
b9d0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  t);.          pP
b9e0: 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20  ager->pInStmt = 
b9f0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
ba00: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
ba10: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
ba20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ba30: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
ba40: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
ba50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ba60: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
ba70: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
ba80: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
ba90: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
baa0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
bab0: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
bac0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bad0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
bae0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  en = 0;.        
baf0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
bb00: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  e = 0;.        p
bb10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
bb20: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  f = 0;.        p
bb30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
bb40: 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
bb50: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
bb60: 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  utoopen = 0;.   
bb70: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
bb80: 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  gDbSize = 0;.   
bb90: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
bba0: 69 66 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 50  if( !MEMDB || pP
bbb0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
bbc0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bbd0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
bbe0: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
bbf0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68        pPager->ch
bc00: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
bc10: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
bc20: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
bc30: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
bc40: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
bc50: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
bc60: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
bc70: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
bc80: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
bc90: 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72  ntered the error
bca0: 20 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e   state, .** do n
bcb0: 6f 74 20 61 74 74 65 6d 70 74 20 74 68 65 20 72  ot attempt the r
bcc0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ollback..*/.stat
bcd0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
bce0: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
bcf0: 61 67 65 72 20 2a 70 29 7b 0a 20 20 61 73 73 65  ager *p){.  asse
bd00: 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41  rt( p->state>=PA
bd10: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
bd20: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  p->journalOpen==
bd30: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 65 72  0 );.  if( p->er
bd40: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
bd50: 20 26 26 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41   && p->state>=PA
bd60: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
bd70: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
bd80: 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d  Rollback(p);.  }
bd90: 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  .  pager_unlock(
bda0: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
bdb0: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e  >errCode || !p->
bdc0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28  journalOpen || (
bdd0: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
bde0: 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  &&!p->journalOff
bdf0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
be00: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d  ->errCode || !p-
be10: 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e  >stmtOpen || p->
be20: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b  exclusiveMode );
be30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
be40: 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
be50: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72  ansaction.  A tr
be60: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
be70: 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20  ed by either.** 
be80: 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f  a COMMIT or a RO
be90: 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68  LLBACK..**.** Wh
bea0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
beb0: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
bec0: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
bed0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
bee0: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
bef0: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
bf00: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
bf10: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
bf20: 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a  e will release.*
bf30: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  * the database l
bf40: 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73  ock and acquires
bf50: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
bf60: 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66 20 74  n its place if t
bf70: 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70  hat is.** the ap
bf80: 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20  propriate thing 
bf90: 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20  to do.  Release 
bfa0: 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73  locks usually is
bfb0: 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a   appropriate,.**
bfc0: 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69   unless we are i
bfd0: 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  n exclusive acce
bfe0: 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73  ss mode or unles
bff0: 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20  s this is a .** 
c000: 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e  COMMIT AND BEGIN
c010: 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44   or ROLLBACK AND
c020: 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e   BEGIN operation
c030: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ..**.** The jour
c040: 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68  nal file is eith
c050: 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72  er deleted or tr
c060: 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  uncated..**.** T
c070: 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65  ODO: Consider ke
c080: 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eping the journa
c090: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20  l file open for 
c0a0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
c0b0: 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67  ses..** This mig
c0c0: 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
c0d0: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
c0e0: 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65  t on windows whe
c0f0: 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20  re opening.** a 
c100: 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e  file is an expen
c110: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  sive operation..
c120: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
c130: 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
c140: 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
c150: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
c160: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
c170: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63  ITE_OK;.  int rc
c180: 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
c190: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
c1a0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
c1b0: 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
c1c0: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
c1d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
c1e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65   }.  sqlite3Page
c1f0: 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67  rStmtCommit(pPag
c200: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
c210: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21  r->stmtOpen && !
c220: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
c230: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  eMode ){.    sql
c240: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
c250: 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70  er->stfd);.    p
c260: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
c270: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
c280: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
c290: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  en ){.    if( pP
c2a0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
c2b0: 6f 64 65 20 0a 20 20 20 20 20 20 20 20 20 20 26  ode .          &
c2c0: 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  & (rc = sqlite3O
c2d0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
c2e0: 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49  ->jfd, 0))==SQLI
c2f0: 54 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20  TE_OK ){;.      
c300: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c310: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
c320: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
c330: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
c340: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
c350: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
c360: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50  ->jfd);.      pP
c370: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
c380: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  n = 0;.      if(
c390: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c3a0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
c3b0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
c3c0: 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
c3d0: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
c3e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c3f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
c400: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
c410: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
c420: 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
c430: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66  urnal = 0;.    f
c440: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
c450: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
c460: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
c470: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
c480: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
c490: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
c4a0: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
c4b0: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  c = 0;.      pPg
c4c0: 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
c4d0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
c4e0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
c4f0: 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
c500: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
c510: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
c520: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  f.    }.    pPag
c530: 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
c540: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
c550: 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
c560: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
c570: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
c580: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
c590: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
c5a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
c5b0: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
c5c0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65  0 || pPager->use
c5d0: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
c5e0: 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
c5f0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
c600: 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55  ){.    rc2 = osU
c610: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
c620: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
c630: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
c640: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
c650: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
c660: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
c670: 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20  ER_SYNCED ){.   
c680: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
c690: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
c6a0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
c6b0: 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a  origDbSize = 0;.
c6c0: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
c6d0: 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
c6e0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
c6f0: 0a 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72  .  lruListSetFir
c700: 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72 29  stSynced(pPager)
c710: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
c720: 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72 65 74 75  ze = -1;..  retu
c730: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
c740: 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
c750: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  .** Compute and 
c760: 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
c770: 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f  m for the page o
c780: 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68  f data..**.** Th
c790: 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
c7a0: 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69   checksum.  It i
c7b0: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
c7c0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
c7d0: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
c7e0: 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61  value and the pa
c7f0: 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65  ge number.  We e
c800: 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68  xperimented with
c810: 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f  .** a checksum o
c820: 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74  f the entire dat
c830: 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20  a, but that was 
c840: 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20  found to be too 
c850: 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  slow..**.** Note
c860: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
c870: 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20  umber is stored 
c880: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
c890: 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20   of data and.** 
c8a0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  the checksum is 
c8b0: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
c8c0: 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f  d.  This is impo
c8d0: 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e  rtant.  If journ
c8e0: 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e  al.** corruption
c8f0: 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
c900: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
c910: 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
c920: 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74  scenario.** is t
c930: 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
c940: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
c950: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
c960: 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a  hanged.  It is.*
c970: 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  * much less like
c980: 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
c990: 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
c9a0: 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
c9b0: 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
c9c0: 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
c9d0: 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
c9e0: 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
c9f0: 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
ca00: 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
ca10: 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
ca20: 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
ca30: 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
ca40: 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20  .**.** FIX ME:  
ca50: 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  Consider adding 
ca60: 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20  every 200th (or 
ca70: 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20  so) byte of the 
ca80: 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63  data to the.** c
ca90: 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77  hecksum.  That w
caa0: 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70  ay if a single p
cab0: 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d  age spans 3 or m
cac0: 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  ore disk sectors
cad0: 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65   and.** only the
cae0: 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69   middle sector i
caf0: 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69  s corrupt, we wi
cb00: 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20  ll still have a 
cb10: 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68  reasonable.** ch
cb20: 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20  ance of failing 
cb30: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64  the checksum and
cb40: 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20   thus detecting 
cb50: 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  the problem..*/.
cb60: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
cb70: 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
cb80: 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a  ager, const u8 *
cb90: 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b  aData){.  u32 ck
cba0: 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
cbb0: 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69  sumInit;.  int i
cbc0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
cbd0: 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65  ize-200;.  while
cbe0: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
cbf0: 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
cc00: 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
cc10: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
cc20: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
cc30: 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
cc40: 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43  tatic void makeC
cc50: 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f  lean(PgHdr*);../
cc60: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
cc70: 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  le page from the
cc80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
cc90: 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73  ened on file des
cca0: 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20  criptor.** jfd. 
ccb0: 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f   Playback this o
ccc0: 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  ne page..**.** I
ccd0: 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74  f useCksum==0 it
cce0: 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72   means this jour
ccf0: 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  nal does not use
cd00: 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65   checksums.  Che
cd10: 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f  cksums.** are no
cd20: 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d  t used in statem
cd30: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63  ent journals bec
cd40: 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a  ause statement j
cd50: 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a  ournals do not.*
cd60: 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76  * need to surviv
cd70: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  e power failures
cd80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cd90: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
cda0: 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
cdb0: 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 73 71 6c   *pPager, .  sql
cdc0: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 0a  ite3_file *jfd,.
cdd0: 20 20 69 36 34 20 6f 66 66 73 65 74 2c 0a 20 20    i64 offset,.  
cde0: 69 6e 74 20 75 73 65 43 6b 73 75 6d 0a 29 7b 0a  int useCksum.){.
cdf0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
ce00: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
ce10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
ce20: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
ce30: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
ce40: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ce60: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
ce70: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
ce80: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
ce90: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
cea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
ceb0: 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
cec0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
ced0: 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28  .  u8 *aData = (
cee0: 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
cef0: 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d  pSpace;   /* Tem
cf00: 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20  p storage for a 
cf10: 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73  page */..  /* us
cf20: 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65  eCksum should be
cf30: 20 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61   true for the ma
cf40: 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66  in journal and f
cf50: 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74  alse for.  ** st
cf60: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
cf70: 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
cf80: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68  his is always th
cf90: 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73  e case.  */.  as
cfa0: 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73  sert( jfd == (us
cfb0: 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d  eCksum ? pPager-
cfc0: 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73  >jfd : pPager->s
cfd0: 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tfd) );.  assert
cfe0: 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63  ( aData );..  rc
cff0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
d000: 64 2c 20 6f 66 66 73 65 74 2c 20 26 70 67 6e 6f  d, offset, &pgno
d010: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d020: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
d030: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
d040: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44  e3OsRead(jfd, aD
d050: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
d060: 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
d070: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
d080: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
d090: 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c;.  pPager->jou
d0a0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
d0b0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b  r->pageSize + 4;
d0c0: 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
d0d0: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
d0e0: 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
d0f0: 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
d100: 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
d110: 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
d120: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
d130: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
d140: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
d150: 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
d160: 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
d170: 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
d180: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
d190: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
d1a0: 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
d1b0: 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
d1c0: 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
d1d0: 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
d1e0: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
d1f0: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
d200: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
d210: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
d220: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d230: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
d240: 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e  if( pgno>(unsign
d250: 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
d260: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
d270: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
d280: 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b   if( useCksum ){
d290: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
d2a0: 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74  bits(jfd, offset
d2b0: 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
d2c0: 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  e+4, &cksum);.  
d2d0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
d2e0: 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
d2f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
d300: 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  4;.    if( pager
d310: 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61  _cksum(pPager, a
d320: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
d330: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d340: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
d350: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
d360: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
d370: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
d380: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
d390: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
d3a0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
d3b0: 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52  ager is in RESER
d3c0: 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  VED state, then 
d3d0: 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
d3e0: 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
d3f0: 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
d400: 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
d410: 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
d420: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
d430: 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
d440: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
d450: 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
d460: 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
d470: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
d480: 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
d490: 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
d4a0: 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
d4b0: 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
d4c0: 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
d4d0: 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
d4e0: 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
d4f0: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
d500: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
d510: 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
d520: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
d530: 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
d540: 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
d550: 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
d560: 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
d570: 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
d580: 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
d590: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
d5a0: 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
d5b0: 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
d5c0: 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
d5d0: 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
d5e0: 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
d5f0: 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
d600: 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56  * If in EXCLUSIV
d610: 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  E state, then we
d620: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
d630: 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
d640: 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ists.  ** and th
d650: 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
d660: 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
d670: 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a  rked not dirty..
d680: 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74    **.  ** Ticket
d690: 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61   #1171:  The sta
d6a0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d  tement journal m
d6b0: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67  ight contain pag
d6c0: 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69  e content that i
d6d0: 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74  s.  ** different
d6e0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63   from the page c
d6f0: 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74  ontent at the st
d700: 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
d710: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69  action..  ** Thi
d720: 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20  s occurs when a 
d730: 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20  page is changed 
d740: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
d750: 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e  rt of a statemen
d760: 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e  t.  ** then chan
d770: 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e  ged again within
d780: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
d790: 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
d7a0: 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73  ck such a.  ** s
d7b0: 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74  tatement we must
d7c0: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
d7d0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
d7e0: 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e  ase unless we kn
d7f0: 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74  ow.  ** for cert
d800: 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ain that origina
d810: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
d820: 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20  are synced into 
d830: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
d840: 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
d850: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f   Otherwise, a po
d860: 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c  wer loss might l
d870: 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61  eave modified da
d880: 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ta in the.  ** d
d890: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74  atabase file wit
d8a0: 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  hout an entry in
d8b0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
d8c0: 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20  urnal that can. 
d8d0: 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20   ** restore the 
d8e0: 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
d8f0: 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20  original form.  
d900: 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d  Two conditions m
d910: 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20  ust be.  ** met 
d920: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
d930: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
d940: 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61  iles. (1) the da
d950: 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20  tabase must be. 
d960: 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29   ** locked.  (2)
d970: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
d980: 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
d990: 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79  content is fully
d9a0: 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20   synced.  ** in 
d9b0: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
d9c0: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
d9d0: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
d9e0: 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65  in cache or else
d9f0: 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69  .  ** the page i
da00: 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64  s marked as need
da10: 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20  Sync==0..  */.  
da20: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
da30: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
da40: 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28  ;.  PAGERTRACE4(
da50: 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
da60: 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
da70: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
da80: 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
da90: 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
daa0: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
dab0: 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61  >pageSize, aData
dac0: 29 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  ));.  if( pPager
dad0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
dae0: 58 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67  XCLUSIVE && (pPg
daf0: 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64  ==0 || pPg->need
db00: 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20  Sync==0) ){.    
db10: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
db20: 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
db30: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
db40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
db50: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
db60: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
db70: 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
db80: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 20 29  );.    if( pPg )
db90: 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  {.      makeClea
dba0: 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  n(pPg);.    }.  
dbb0: 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
dbc0: 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
dbd0: 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
dbe0: 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
dbf0: 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
dc00: 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
dc10: 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
dc20: 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
dc30: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
dc40: 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
dc50: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
dc60: 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
dc70: 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
dc80: 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
dc90: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
dca0: 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
dcb0: 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
dcc0: 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
dcd0: 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
dce0: 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  ** sqlite3PagerR
dcf0: 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a  ollback()..    *
dd00: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
dd10: 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74  a;.    /* assert
dd20: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c  ( pPg->nRef==0 |
dd30: 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29  | pPg->pgno==1 )
dd40: 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d  ; */.    pData =
dd50: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
dd60: 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  Pg);.    memcpy(
dd70: 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50  pData, aData, pP
dd80: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
dd90: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
dda0: 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
ddb0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
ddc0: 6e 69 74 65 72 28 70 50 67 2c 20 70 50 61 67 65  niter(pPg, pPage
ddd0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
dde0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
ddf0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
de00: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
de10: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
de20: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
de30: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
de40: 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
de50: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
de60: 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
de70: 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
de80: 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
de90: 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
dea0: 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
deb0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
dec0: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
ded0: 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
dee0: 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
def0: 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
df00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
df10: 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
df20: 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
df30: 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
df40: 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
df50: 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
df60: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
df70: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
df80: 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
df90: 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
dfa0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
dfb0: 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
dfc0: 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
dfd0: 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
dfe0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
dff0: 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
e000: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
e010: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
e020: 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
e030: 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
e040: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e050: 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
e060: 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
e070: 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
e080: 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
e090: 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
e0a0: 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
e0b0: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
e0c0: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
e0d0: 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
e0e0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a  unction..**.**.*
e0f0: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
e100: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
e110: 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ns the names of 
e120: 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  all child journa
e130: 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69  ls..** To tell i
e140: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
e150: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
e160: 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68  d, check to each
e170: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64   of the.** child
e180: 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69  ren.  If all chi
e190: 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72  ldren are either
e1a0: 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e   missing or do n
e1b0: 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61  ot refer to.** a
e1c0: 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65   different maste
e1d0: 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  r journal, then 
e1e0: 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72  this master jour
e1f0: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
e200: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
e210: 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
e220: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
e230: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
e240: 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
e250: 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
e260: 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
e270: 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65   rc;.  int maste
e280: 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71  r_open = 0;.  sq
e290: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
e2a0: 74 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ter;.  sqlite3_f
e2b0: 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20  ile *pJournal;. 
e2c0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
e2d0: 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
e2e0: 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
e2f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
e300: 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f  .  i64 nMasterJo
e310: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  urnal;       /* 
e320: 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
e330: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a  ournal file */..
e340: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
e350: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e360: 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
e370: 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72   case some other
e380: 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73   process.  ** is
e390: 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f   running this ro
e3a0: 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20  utine also. Not 
e3b0: 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f  that it makes to
e3c0: 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63  o much differenc
e3d0: 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  e..  */.  pMaste
e3e0: 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
e3f0: 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e *)sqlite3_mall
e400: 6f 63 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  oc(pVfs->szOsFil
e410: 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
e420: 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
e430: 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
e440: 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
e450: 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
e460: 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
e470: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
e480: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
e490: 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
e4a0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
e4b0: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
e4c0: 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  TER_JOURNAL);.  
e4d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e4e0: 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74  Open(pVfs, zMast
e4f0: 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61  er, pMaster, fla
e500: 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  gs, 0);.  }.  if
e510: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e520: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
e530: 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f  _out;.  master_o
e540: 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d  pen = 1;..  rc =
e550: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
e560: 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
e570: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
e580: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e590: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
e5a0: 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
e5b0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
e5c0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
e5d0: 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
e5e0: 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
e5f0: 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  .    int nMaster
e600: 50 74 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Ptr = pPager->pV
e610: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
e620: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
e630: 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
e640: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
e650: 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
e660: 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  d from.    ** sq
e670: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
e680: 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
e690: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
e6a0: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61   .    */.    zMa
e6b0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63  sterJournal = (c
e6c0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
e6d0: 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72  lloc(nMasterJour
e6e0: 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72  nal + nMasterPtr
e6f0: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
e700: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
e710: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e720: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
e730: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
e740: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74  .    }.    zMast
e750: 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
e760: 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
e770: 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20  ournal];.    rc 
e780: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
e790: 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
e7a0: 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72  Journal, nMaster
e7b0: 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
e7c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e7d0: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
e7e0: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a  ter_out;..    zJ
e7f0: 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
e800: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69  Journal;.    whi
e810: 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
e820: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
e830: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
e840: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
e850: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
e860: 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
e870: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20  _ACCESS_EXISTS) 
e880: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ){.        /* On
e890: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
e8a0: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
e8b0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e8c0: 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
e8d0: 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
e8e0: 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
e8f0: 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
e900: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
e910: 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65         ** so, re
e920: 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
e930: 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
e940: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
e950: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
e960: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20    int c;.       
e970: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
e980: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
e990: 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
e9a0: 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
e9b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e9c0: 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
e9d0: 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
e9e0: 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
e9f0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
ea00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ea10: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
ea20: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
ea30: 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
ea40: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
ea50: 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
ea60: 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
ea70: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Ptr);.        sq
ea80: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f  lite3OsClose(pJo
ea90: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  urnal);.        
eaa0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
eab0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
eac0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
ead0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
eae0: 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65        c = zMaste
eaf0: 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74  rPtr[0]!=0 && st
eb00: 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
eb10: 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
eb20: 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
eb30: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
eb40: 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
eb50: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
eb60: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
eb70: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
eb80: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
eb90: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
eba0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
ebb0: 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e  urnal += (strlen
ebc0: 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
ebd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63     }.  }.  .  rc
ebe0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
ebf0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
ec00: 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  , 0);..delmaster
ec10: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73  _out:.  if( zMas
ec20: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
ec30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ec40: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
ec50: 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74    }  .  if( mast
ec60: 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73  er_open ){.    s
ec70: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
ec80: 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  aster);.  }.  sq
ec90: 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74  lite3_free(pMast
eca0: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
ecb0: 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69  ;.}...static voi
ecc0: 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  d pager_truncate
ecd0: 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50  _cache(Pager *pP
ece0: 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72  ager);../*.** Tr
ecf0: 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20  uncate the main 
ed00: 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65  file of the give
ed10: 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e  n pager to the n
ed20: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
ed30: 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c 73  * indicated. Als
ed40: 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63  o truncate the c
ed50: 61 63 68 65 64 20 72 65 70 72 65 73 65 6e 74 61  ached representa
ed60: 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
ed70: 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20 6d 69  ..**.** Might mi
ed80: 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
ed90: 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e  that the file on
eda0: 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72   disk is smaller
edb0: 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a 2a 20   than nPage..** 
edc0: 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2c  This can happen,
edd0: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   for example, if
ede0: 20 77 65 20 61 72 65 20 69 6e 20 74 68 65 20 6d   we are in the m
edf0: 69 64 64 6c 65 20 6f 66 20 61 20 74 72 61 6e 73  iddle of a trans
ee00: 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20  action.** which 
ee10: 68 61 73 20 65 78 74 65 6e 64 65 64 20 74 68 65  has extended the
ee20: 20 66 69 6c 65 20 73 69 7a 65 20 61 6e 64 20 74   file size and t
ee30: 68 65 20 6e 65 77 20 70 61 67 65 73 20 61 72 65  he new pages are
ee40: 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c 64 0a   still all held.
ee50: 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20 74 68 65  ** in cache, the
ee60: 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 55  n an INSERT or U
ee70: 50 44 41 54 45 20 64 6f 65 73 20 61 20 73 74 61  PDATE does a sta
ee80: 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e  tement rollback.
ee90: 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72 61 74    Some.** operat
eea0: 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65  ing system imple
eeb0: 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67  mentations can g
eec0: 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 79  et confused if y
eed0: 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74 72 75  ou try to.** tru
eee0: 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
eef0: 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
ef00: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
ef10: 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 0a 2a   currently is,.*
ef20: 2a 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73  * so detect this
ef30: 20 63 61 73 65 20 61 6e 64 20 64 6f 20 6e 6f 74   case and do not
ef40: 20 64 6f 20 74 68 65 20 74 72 75 6e 63 61 74 69   do the truncati
ef50: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
ef60: 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
ef70: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ef80: 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  int nPage){.  in
ef90: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
efa0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
efb0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
efc0: 4c 55 53 49 56 45 20 26 26 20 70 50 61 67 65 72  LUSIVE && pPager
efd0: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
efe0: 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e  {.    i64 curren
eff0: 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a  tSize, newSize;.
f000: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f010: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
f020: 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53  r->fd, &currentS
f030: 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a  ize);.    newSiz
f040: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
f050: 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b  Size*(i64)nPage;
f060: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f070: 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e  ITE_OK && curren
f080: 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b  tSize>newSize ){
f090: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f0a0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
f0b0: 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
f0c0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
f0d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f0e0: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
f0f0: 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
f100: 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  .    pager_trunc
f110: 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
f120: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
f130: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
f140: 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20   the sectorSize 
f150: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
f160: 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ger..**.** The s
f170: 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 74 68  ector size is th
f180: 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20  e larger of the 
f190: 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f  sector size repo
f1a0: 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74  rted.** by sqlit
f1b0: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
f1c0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 53 69 7a   and the pageSiz
f1d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
f1e0: 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
f1f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
f200: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
f210: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
f220: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
f230: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
f240: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
f250: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
f260: 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
f270: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
f280: 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
f290: 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
f2a0: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
f2b0: 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69 68  ed yet, in whcih
f2c0: 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
f2d0: 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
f2e0: 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
f2f0: 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  lt..    */.    p
f300: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
f310: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
f320: 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
f330: 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  fd);.  }.  if( p
f340: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
f350: 65 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e<pPager->pageSi
f360: 7a 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ze ){.    pPager
f370: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 70  ->sectorSize = p
f380: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
f390: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
f3a0: 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
f3b0: 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
f3c0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
f3d0: 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
f3e0: 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
f3f0: 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
f400: 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
f410: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
f420: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
f430: 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
f440: 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
f450: 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
f460: 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
f470: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
f480: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
f490: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
f4a0: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
f4b0: 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
f4c0: 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
f4d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
f4e0: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
f4f0: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
f500: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
f510: 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
f520: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
f530: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
f540: 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
f550: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
f560: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
f570: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
f580: 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
f590: 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
f5a0: 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
f5b0: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
f5c0: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
f5d0: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
f5e0: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
f5f0: 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
f600: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
f610: 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
f620: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
f630: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
f640: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
f650: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
f660: 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
f670: 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
f680: 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
f690: 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
f6a0: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
f6b0: 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29  ournal.).**  (6)
f6c0: 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
f6d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f6e0: 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
f6f0: 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
f700: 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
f710: 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
f720: 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
f730: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
f740: 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
f750: 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
f760: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
f770: 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
f780: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
f790: 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
f7a0: 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
f7b0: 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
f7c0: 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37  in UTF-8..**  (7
f7d0: 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
f7e0: 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
f7f0: 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
f800: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
f810: 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
f820: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
f830: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f840: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
f850: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
f860: 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
f870: 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
f880: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f890: 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
f8a0: 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65 6d  the first 6 item
f8b0: 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
f8c0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
f8d0: 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
f8e0: 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68 20  ance of the 7th 
f8f0: 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
f900: 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
f910: 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
f920: 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
f930: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
f940: 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
f950: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
f960: 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
f970: 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
f980: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
f990: 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
f9a0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
f9b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
f9c0: 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
f9d0: 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
f9e0: 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
f9f0: 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
fa00: 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
fa10: 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
fa20: 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
fa30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
fa40: 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
fa50: 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
fa60: 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
fa70: 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
fa80: 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
fa90: 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
faa0: 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
fab0: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
fac0: 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
fad0: 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
fae0: 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
faf0: 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
fb00: 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
fb10: 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
fb20: 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
fb30: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
fb40: 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
fb50: 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
fb60: 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
fb70: 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
fb80: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
fb90: 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
fba0: 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
fbb0: 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
fbc0: 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
fbd0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
fbe0: 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
fbf0: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
fc00: 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
fc10: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
fc20: 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
fc30: 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
fc40: 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
fc50: 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
fc60: 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
fc70: 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
fc80: 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
fc90: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
fca0: 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
fcb0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
fcc0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
fcd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
fce0: 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
fcf0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
fd00: 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
fd10: 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
fd20: 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
fd30: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
fd40: 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
fd50: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
fd60: 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
fd70: 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
fd80: 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
fd90: 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
fda0: 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
fdb0: 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
fdc0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
fdd0: 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
fde0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
fdf0: 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
fe00: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
fe10: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
fe20: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
fe30: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
fe40: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
fe50: 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
fe60: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
fe70: 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
fe80: 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
fe90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fea0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
feb0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
fec0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
fed0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
fee0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
fef0: 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
ff00: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
ff10: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
ff20: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
ff30: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
ff40: 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
ff50: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
ff60: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
ff70: 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
ff80: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
ff90: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
ffa0: 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
ffb0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
ffc0: 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
ffd0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
ffe0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
fff0: 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a  file if any */..
10000 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
10010 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
10020 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
10030 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
10040 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
10050 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
10060 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
10070 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
10080 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  en );.  rc = sql
10090 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
100a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
100b0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
100c0 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30  ITE_OK || szJ==0
100d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
100e0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
100f0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61    /* Read the ma
10100 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10110 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
10120 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  al, if it is pre
10130 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20  sent..  ** If a 
10140 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10150 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63  ile name is spec
10160 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66  ified, but the f
10170 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ile is not.  ** 
10180 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c  present on disk,
10190 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
101a0 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64  l is not hot and
101b0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
101c0 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64  o be.  ** played
101d0 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d   back..  */.  zM
101e0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
101f0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
10200 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
10210 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
10220 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
10230 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
10240 6d 65 2b 31 29 3b 0a 20 20 61 73 73 65 72 74 28  me+1);.  assert(
10250 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
10260 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
10270 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 7c 7c 20 28  LITE_OK .   || (
10280 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 21 73  zMaster[0] && !s
10290 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
102a0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
102b0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
102c0 54 53 29 29 20 0a 20 20 29 7b 0a 20 20 20 20 7a  TS)) .  ){.    z
102d0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
102e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
102f0 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ONE ) rc = SQLIT
10300 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  E_OK;.    goto e
10310 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
10320 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
10330 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7a 4d 61  alOff = 0;.  zMa
10340 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ster = 0;..  /* 
10350 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
10360 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
10370 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c   the readJournal
10380 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72  Hdr() call retur
10390 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44  ns.  ** SQLITE_D
103a0 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  ONE or an IO err
103b0 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
103c0 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20  while( 1 ){..   
103d0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
103e0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
103f0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
10400 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
10410 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
10420 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
10430 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
10440 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
10450 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
10460 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
10470 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
10480 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20  process must of 
10490 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
104a0 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
104b0 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
104c0 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
104d0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
104e0 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
104f0 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
10500 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
10510 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
10520 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10530 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
10540 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
10550 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
10560 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
10580 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
10590 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
105a0 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
105b0 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
105c0 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
105d0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
105e0 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
105f0 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
10600 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
10610 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
10620 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
10630 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
10640 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
10650 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
10660 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
10670 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
10680 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
10690 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
106a0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
106b0 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
106c0 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
106d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
106e0 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
106f0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
10700 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
10710 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f   (szJ - JOURNAL_
10720 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
10730 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
10740 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ager);.    }..  
10750 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
10760 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
10770 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
10780 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
10790 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
107a0 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
107b0 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
107c0 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
107d0 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
107e0 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
107f0 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
10800 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
10810 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
10820 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
10830 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
10840 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
10850 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
10860 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
10870 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
10880 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
10890 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
108a0 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
108b0 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
108c0 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
108d0 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
108e0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
108f0 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a  =0 && !isHot &&.
10900 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
10910 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
10920 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
10930 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
10940 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e  alOff ){.      n
10950 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
10960 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
10970 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
10980 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
10990 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
109a0 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
109b0 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
109c0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
109d0 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
109e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
109f0 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
10a00 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
10a10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
10a20 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
10a30 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
10a40 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
10a50 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
10a60 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
10a70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10a80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10a90 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
10aa0 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
10ab0 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  }..    /* Copy o
10ac0 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
10ad0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
10ae0 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
10af0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10b00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
10b10 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b  (i=0; i<nRec; i+
10b20 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
10b30 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
10b40 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
10b50 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
10b60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
10b70 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
10b80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10b90 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
10ba0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
10bb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
10bc0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
10bd0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10be0 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
10bf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10c00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10c10 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
10c20 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
10c30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
10c40 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
10c50 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  HED*/.  assert( 
10c60 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  0 );..end_playba
10c70 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
10c80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
10c90 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
10ca0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
10cb0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
10cc0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
10cd0 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
10ce0 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
10cf0 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d 0a 20 20  hname+1);.  }.  
10d00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10d10 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
10d20 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
10d30 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
10d40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
10d50 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
10d60 30 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  0] ){.    /* If 
10d70 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
10d80 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
10d90 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
10da0 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
10db0 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
10dc0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
10dd0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
10de0 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
10df0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
10e00 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
10e10 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
10e20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
10e30 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
10e40 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
10e50 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
10e60 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
10e70 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
10e80 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
10e90 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
10ea0 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
10eb0 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
10ec0 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
10ed0 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
10ee0 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
10ef0 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
10f00 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
10f10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10f20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61  Playback the sta
10f30 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
10f40 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69  **.** This is si
10f50 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67  milar to playing
10f60 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61   back the transa
10f70 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75  ction journal bu
10f80 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20  t with.** a few 
10f90 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a  extra twists..**
10fa0 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20  .**    (1)  The 
10fb0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
10fc0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
10fd0 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72  file at the star
10fe0 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
10ff0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
11000 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65   stored in pPage
11010 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74  r->stmtSize, not
11020 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
11030 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
11040 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20  itself..**.**   
11050 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f   (2)  In additio
11060 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  n to playing bac
11070 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
11080 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a  journal, also.**
11090 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63           playbac
110a0 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74  k all pages of t
110b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
110c0 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67  ournal beginning
110d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f  .**         at o
110e0 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74  ffset pPager->st
110f0 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  mtJSize..*/.stat
11100 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d  ic int pager_stm
11110 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  t_playback(Pager
11120 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
11130 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
11140 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
11150 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61   the full journa
11160 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66  l */.  i64 hdrOf
11170 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  f;.  int nRec;  
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11190 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
111a0 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ds */.  int i;  
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111c0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
111d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
111e0 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
111f0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64  ournalOff;.#ifnd
11200 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20  ef NDEBUG .  {. 
11210 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20     i64 os_szJ;. 
11220 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11230 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
11240 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b  ->jfd, &os_szJ);
11250 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11260 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
11270 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
11280 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20  szJ==os_szJ );. 
11290 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
112a0 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65  Set hdrOff to be
112b0 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74   the offset just
112c0 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f   after the end o
112d0 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e  f the last journ
112e0 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69  al.  ** page wri
112f0 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20  tten before the 
11300 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
11310 61 64 65 72 20 66 6f 72 20 74 68 69 73 20 73 74  ader for this st
11320 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61  atement.  ** tra
11330 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69  nsaction was wri
11340 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64  tten, or the end
11350 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20   of the file if 
11360 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  no journal.  ** 
11370 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
11380 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66  en..  */.  hdrOf
11390 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
113a0 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74  HdrOff;.  assert
113b0 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
113c0 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b  nc || !hdrOff );
113d0 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29  .  if( !hdrOff )
113e0 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73  {.    hdrOff = s
113f0 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  zJ;.  }.  .  /* 
11400 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  Truncate the dat
11410 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74  abase back to it
11420 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
11430 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
11440 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
11450 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  er, pPager->stmt
11460 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
11470 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
11480 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
11490 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
114a0 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
114b0 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  s are in the sta
114c0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
114d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
114e0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
114f0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
11500 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65  nalOpen );.  nRe
11510 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  c = pPager->stmt
11520 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f  NRec;.  .  /* Co
11530 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
11540 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61  s out of the sta
11550 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  tement journal a
11560 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
11570 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
11580 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ile.  Note that 
11590 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
115a0 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63  urnal omits chec
115b0 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  ksums from.  ** 
115c0 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63  each record sinc
115d0 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  e power-failure 
115e0 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20  recovery is not 
115f0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61  important to sta
11600 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72  tement.  ** jour
11610 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  nals..  */.  for
11620 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b  (i=0; i<nRec; i+
11630 2b 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73  +){.    i64 offs
11640 65 74 20 3d 20 69 2a 28 34 2b 70 50 61 67 65 72  et = i*(4+pPager
11650 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
11660 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
11670 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
11680 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
11690 66 64 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a  fd, offset, 0);.
116a0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
116b0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
116c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
116d0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
116e0 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
116f0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c   }..  /* Now rol
11700 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63  l some pages bac
11710 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73  k from the trans
11720 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20  action journal. 
11730 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a  Pager.stmtJSize.
11740 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a    ** was the siz
11750 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
11760 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
11770 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74  statement was st
11780 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65  arted, so.  ** e
11790 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20  verything after 
117a0 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
117b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69   rolled back, ei
117c0 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ther into the.  
117d0 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
117e0 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f   memory cache, o
117f0 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a  r both..  **.  *
11800 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a  * If it is not z
11810 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ero, then Pager.
11820 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68  stmtHdrOff is th
11830 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
11840 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
11850 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
11860 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64  header written d
11870 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65  uring this state
11880 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
11890 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
118a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  >journalOff = pP
118b0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b  ager->stmtJSize;
118c0 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  .  pPager->cksum
118d0 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Init = pPager->s
118e0 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c  tmtCksum;.  whil
118f0 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
11900 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29  alOff < hdrOff )
11910 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
11920 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
11930 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
11940 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
11950 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a  journalOff, 1);.
11960 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
11970 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
11980 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11990 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
119a0 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
119b0 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61   }..  while( pPa
119c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
119d0 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  < szJ ){.    u32
119e0 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20   nJRec;         
119f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
11a00 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
11a10 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
11a20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
11a30 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
11a40 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
11a50 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  my);.    if( rc!
11a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11a70 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
11a80 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
11a90 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74       goto end_st
11aa0 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
11ab0 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63   }.    if( nJRec
11ac0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52  ==0 ){.      nJR
11ad0 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67  ec = (szJ - pPag
11ae0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
11af0 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  / (pPager->pageS
11b00 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20  ize+8);.    }.  
11b10 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b    for(i=nJRec-1;
11b20 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d   i>=0 && pPager-
11b30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
11b40 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72  J; i--){.      r
11b50 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
11b60 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
11b70 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
11b80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11b90 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  Off, 1);.      a
11ba0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
11bb0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
11bc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11bd0 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
11be0 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
11bf0 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
11c00 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
11c10 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70  J;.  .end_stmt_p
11c20 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
11c30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  c==SQLITE_OK) {.
11c40 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
11c50 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
11c60 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61    /* pager_reloa
11c70 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
11c80 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
11c90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
11ca0 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
11cb0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
11cc0 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
11cd0 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
11ce0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
11cf0 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
11d00 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
11d10 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
11d20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
11d30 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
11d40 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73  = mxPage;.  }els
11d50 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  e{.    pPager->m
11d60 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a  xPage = 10;.  }.
11d70 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
11d80 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
11d90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
11da0 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
11db0 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
11dc0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
11dd0 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
11de0 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
11df0 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
11e00 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
11e10 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
11e20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
11e30 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
11e40 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
11e50 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
11e60 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
11e70 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
11e80 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
11e90 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
11ea0 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
11eb0 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
11ec0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
11ed0 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
11ee0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
11ef0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
11f00 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
11f10 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
11f20 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
11f30 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
11f40 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
11f50 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
11f60 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
11f70 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
11f80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11f90 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
11fa0 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
11fb0 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
11fc0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
11fd0 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
11fe0 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
11ff0 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
12000 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
12020 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
12030 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
12040 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
12050 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
12060 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
12070 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
12080 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
12090 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
120a0 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
120b0 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
120c0 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
120d0 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
120e0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
120f0 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
12100 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
12110 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
12120 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
12130 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
12140 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
12150 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
12160 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
12170 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
12180 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
12190 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
121a0 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
121b0 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
121c0 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
121d0 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
121e0 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
121f0 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
12200 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
12210 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
12220 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
12230 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
12240 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
12250 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
12260 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
12270 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
12280 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
12290 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
122a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
122b0 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65  SafetyLevel(Page
122c0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
122d0 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66  evel, int full_f
122e0 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d  sync){.  pPager-
122f0 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c  >noSync =  level
12300 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
12310 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
12320 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
12330 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
12340 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
12350 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
12360 73 20 3d 20 28 66 75 6c 6c 5f 66 73 79 6e 63 3f  s = (full_fsync?
12370 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
12380 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  :SQLITE_SYNC_NOR
12390 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  MAL);.  if( pPag
123a0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
123b0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
123c0 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
123d0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
123e0 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
123f0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
12400 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
12410 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
12420 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
12430 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
12440 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
12450 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
12460 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
12470 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
12480 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
12490 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
124a0 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
124b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
124c0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
124d0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  le. .**.** Write
124e0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
124f0 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20  ptor into *fd.  
12500 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
12510 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73   on success or s
12520 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72  ome.** other err
12530 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
12540 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  il. The OS will 
12550 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
12560 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
12570 72 79 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  ry.** file when 
12580 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  it is closed..*/
12590 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
125a0 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
125b0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
125c0 2a 70 56 66 73 2c 20 20 20 20 2f 2a 20 54 68 65  *pVfs,    /* The
125d0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
125e0 73 74 65 6d 20 6c 61 79 65 72 20 2a 2f 0a 20 20  stem layer */.  
125f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
12600 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
12610 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
12620 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 63 68 61  or here */.  cha
12630 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
12640 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
12650 65 20 66 69 6c 65 2e 20 20 4d 69 67 68 74 20 62  e file.  Might b
12660 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
12670 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
12680 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
12690 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
126a0 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
126b0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 7a   rc;.  assert( z
126c0 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 0a  Filename!=0 );..
126d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
126e0 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
126f0 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
12700 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
12710 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
12720 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
12730 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
12740 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
12750 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
12760 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
12770 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
12780 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
12790 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
127a0 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
127b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
127c0 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
127d0 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
127e0 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
127f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
12800 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  | pFile->pMethod
12810 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  s );.  return rc
12820 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
12830 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63  e a new page cac
12840 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  he and put a poi
12850 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
12860 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67   cache in *ppPag
12870 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  er..** The file 
12880 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65  to be cached nee
12890 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68  d not exist.  Th
128a0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f  e file is not lo
128b0 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68  cked until.** th
128c0 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
128d0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
128e0 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65  ) and is only he
128f0 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68  ld open until th
12900 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69  e.** last page i
12910 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  s released using
12920 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
12930 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ef()..**.** If z
12940 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
12950 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
12960 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
12970 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
12980 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
12990 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
129a0 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65  ached.  The file
129b0 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
129c0 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
129d0 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  y when it is clo
129e0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  sed..**.** If zF
129f0 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
12a00 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69  ory:" then all i
12a10 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
12a20 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20  ld in cache..** 
12a30 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
12a40 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68  ten to disk.  Th
12a50 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
12a60 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a  o implement an.*
12a70 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
12a80 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
12a90 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
12aa0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
12ab0 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
12ac0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
12ad0 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
12ae0 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
12af0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
12b00 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
12b10 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
12b20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
12b30 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
12b40 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
12b50 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
12b60 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12b80 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
12b90 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
12ba0 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
12bb0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
12bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
12bd0 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
12be0 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
12bf0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
12c00 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70        /* flags p
12c10 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
12c20 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
12c30 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  en() */.){.  u8 
12c40 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
12c50 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e  pPager = 0;.  in
12c60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12c70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
12c80 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20   tempFile = 0;. 
12c90 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a   int memDb = 0;.
12ca0 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
12cb0 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   0;.  int useJou
12cc0 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
12cd0 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
12ce0 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f  AL)==0;.  int no
12cf0 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
12d00 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
12d10 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74  DLOCK)!=0;.  int
12d20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
12d30 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
12d40 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 69  lSize(pVfs);.  i
12d50 6e 74 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20  nt nDefaultPage 
12d60 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
12d70 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63 68  _PAGE_SIZE;.  ch
12d80 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 3b 0a 20  ar *zPathname;. 
12d90 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 3b 0a   int nPathname;.
12da0 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 4a 72 6e    char *zStmtJrn
12db0 6c 3b 0a 20 20 69 6e 74 20 6e 53 74 6d 74 4a 72  l;.  int nStmtJr
12dc0 6e 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65  nl;..  /* The de
12dd0 66 61 75 6c 74 20 72 65 74 75 72 6e 20 69 73 20  fault return is 
12de0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 2a  a NULL pointer *
12df0 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
12e00 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
12e10 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
12e20 65 20 2a 2f 0a 20 20 6e 50 61 74 68 6e 61 6d 65  e */.  nPathname
12e30 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
12e40 61 6d 65 2b 31 3b 0a 20 20 7a 50 61 74 68 6e 61  ame+1;.  zPathna
12e50 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  me = sqlite3_mal
12e60 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29  loc(nPathname*2)
12e70 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  ;.  if( zPathnam
12e80 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
12e90 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
12ea0 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65  .  }.  if( zFile
12eb0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
12ec0 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20  e[0] ){.#ifndef 
12ed0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
12ee0 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
12ef0 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
12f00 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
12f10 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
12f20 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
12f30 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  [0] = 0;.    }el
12f40 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
12f50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12f60 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
12f70 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
12f80 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
12f90 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  thname);.    }. 
12fa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
12fb0 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54 65 6d   sqlite3OsGetTem
12fc0 70 6e 61 6d 65 28 70 56 66 73 2c 20 6e 50 61 74  pname(pVfs, nPat
12fd0 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
12fe0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
12ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13000 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13010 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
13020 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
13030 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 74 72 6c  nPathname = strl
13040 65 6e 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 0a  en(zPathname);..
13050 20 20 2f 2a 20 50 75 74 20 74 68 65 20 73 74 61    /* Put the sta
13060 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
13070 6e 20 74 65 6d 70 6f 72 61 72 79 20 64 69 73 6b  n temporary disk
13080 20 73 70 61 63 65 20 73 69 6e 63 65 20 74 68 69   space since thi
13090 73 20 69 73 0a 20 20 2a 2a 20 73 6f 6d 65 74 69  s is.  ** someti
130a0 6d 65 73 20 52 41 4d 20 64 69 73 6b 20 6f 72 20  mes RAM disk or 
130b0 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 65 64 20  other optimized 
130c0 73 74 6f 72 61 67 65 2e 20 20 55 6e 6c 69 6b 65  storage.  Unlike
130d0 6c 79 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a  ly the main.  **
130e0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
130f0 6c 65 2c 20 74 68 65 20 73 74 61 74 65 6d 65 6e  le, the statemen
13100 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  t journal does n
13110 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 0a 20  ot need to be . 
13120 20 2a 2a 20 63 6f 6c 6f 63 61 74 65 64 20 77 69   ** colocated wi
13130 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
13140 6e 6f 72 20 64 6f 65 73 20 69 74 20 6e 65 65 64  nor does it need
13150 20 74 6f 20 62 65 20 70 65 72 73 69 73 74 65 6e   to be persisten
13160 74 2e 0a 20 20 2a 2f 0a 20 20 7a 53 74 6d 74 4a  t..  */.  zStmtJ
13170 72 6e 6c 20 3d 20 26 7a 50 61 74 68 6e 61 6d 65  rnl = &zPathname
13180 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20  [nPathname+1];. 
13190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 47   rc = sqlite3OsG
131a0 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c  etTempname(pVfs,
131b0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
131c0 65 2b 31 2c 20 7a 53 74 6d 74 4a 72 6e 6c 29 3b  e+1, zStmtJrnl);
131d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
131e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
131f0 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
13200 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
13210 72 63 3b 0a 20 20 7d 0a 20 20 6e 53 74 6d 74 4a  rc;.  }.  nStmtJ
13220 72 6e 6c 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74  rnl = strlen(zSt
13230 6d 74 4a 72 6e 6c 29 3b 0a 0a 20 20 2f 2a 20 41  mtJrnl);..  /* A
13240 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
13250 6f 72 20 74 68 65 20 70 61 67 65 72 20 73 74 72  or the pager str
13260 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61 67  ucture */.  pPag
13270 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  er = sqlite3Mall
13280 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a 65  ocZero(.    size
13290 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20 20  of(*pPager) +   
132a0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
132b0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
132c0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
132d0 65 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e +           /*
132e0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
132f0 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 20 0a  e structure */ .
13300 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69      pVfs->szOsFi
13310 6c 65 20 2a 20 33 20 2b 20 20 20 20 20 20 20 20  le * 3 +        
13320 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 61  /* The main db a
13330 6e 64 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66  nd two journal f
13340 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 33 2a 6e  iles */ .    3*n
13350 50 61 74 68 6e 61 6d 65 20 2b 20 34 30 20 2b 20  Pathname + 40 + 
13360 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
13370 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f 72  ename, zDirector
13380 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  y, zJournal */. 
13390 20 20 20 6e 53 74 6d 74 4a 72 6e 6c 20 20 20 20     nStmtJrnl    
133a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
133b0 2a 20 7a 53 74 6d 74 4a 72 6e 6c 20 2a 2f 0a 20  * zStmtJrnl */. 
133c0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
133d0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
133e0 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
133f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
13400 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
13410 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 26 70   pPtr = (u8 *)&p
13420 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67  Pager[1];.  pPag
13430 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76  er->vfsFlags = v
13440 66 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65  fsFlags;.  pPage
13450 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33  r->fd = (sqlite3
13460 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
13470 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a  s->szOsFile*0];.
13480 20 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d    pPager->stfd =
13490 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
134a0 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
134b0 46 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65  File*1];.  pPage
134c0 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  r->jfd = (sqlite
134d0 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
134e0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b  fs->szOsFile*2];
134f0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
13500 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
13510 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
13520 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65  le*2+journalFile
13530 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d  Size];.  pPager-
13540 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70  >zDirectory = &p
13550 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
13560 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20  [nPathname+1];. 
13570 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
13580 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69  l = &pPager->zDi
13590 72 65 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d  rectory[nPathnam
135a0 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e+1];.  pPager->
135b0 7a 53 74 6d 74 4a 72 6e 6c 20 3d 20 26 70 50 61  zStmtJrnl = &pPa
135c0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
135d0 61 74 68 6e 61 6d 65 2b 31 30 5d 3b 0a 20 20 70  athname+10];.  p
135e0 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
135f0 66 73 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61  fs;.  memcpy(pPa
13600 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
13610 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
13620 6e 61 6d 65 2b 31 29 3b 0a 20 20 6d 65 6d 63 70  name+1);.  memcp
13630 79 28 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a  y(pPager->zStmtJ
13640 72 6e 6c 2c 20 7a 53 74 6d 74 4a 72 6e 6c 2c 20  rnl, zStmtJrnl, 
13650 6e 53 74 6d 74 4a 72 6e 6c 2b 31 29 3b 0a 20 20  nStmtJrnl+1);.  
13660 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
13670 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4f  thname);..  /* O
13680 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  pen the pager fi
13690 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  le..  */.  if( z
136a0 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
136b0 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d  ename[0] && !mem
136c0 44 62 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 50  Db ){.    if( nP
136d0 61 74 68 6e 61 6d 65 3e 28 70 56 66 73 2d 3e 6d  athname>(pVfs->m
136e0 78 50 61 74 68 6e 61 6d 65 20 2d 20 73 69 7a 65  xPathname - size
136f0 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29 20  of("-journal")) 
13700 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
13710 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
13720 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13730 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
13740 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13750 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
13760 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
13770 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20 20  pPager->fd,.    
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13790 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73       pPager->vfs
137a0 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
137b0 20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20       readOnly = 
137c0 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
137d0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20  N_READONLY);..  
137e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
137f0 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  le was successfu
13800 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72  lly opened for r
13810 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
13820 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ,.      ** choos
13830 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
13840 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
13850 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
13860 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
13870 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
13880 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
13890 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
138a0 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   of:.      **.  
138b0 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
138c0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
138d0 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20 20  SIZE,.      **  
138e0 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65    + The value re
138f0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
13900 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a  3OsSectorSize().
13910 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68        **    + Th
13920 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73  e largest page s
13930 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ize that can be 
13940 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
13950 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
13960 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13970 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c  E_OK && !readOnl
13980 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  y ){.        int
13990 20 69 53 65 63 74 6f 72 53 69 7a 65 20 3d 20 73   iSectorSize = s
139a0 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
139b0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
139c0 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65 66          if( nDef
139d0 61 75 6c 74 50 61 67 65 3c 69 53 65 63 74 6f 72  aultPage<iSector
139e0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
139f0 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d    nDefaultPage =
13a00 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
13a10 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
13a20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
13a30 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
13a40 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e    {.          in
13a50 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
13a60 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
13a70 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
13a80 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  d);.          in
13a90 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  t ii;.          
13aa0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
13ab0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
13ac0 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
13ad0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
13ae0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
13af0 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
13b00 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
13b10 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
13b20 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
13b30 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20  5536);.         
13b40 20 66 6f 72 28 69 69 3d 6e 44 65 66 61 75 6c 74   for(ii=nDefault
13b50 50 61 67 65 3b 20 69 69 3c 3d 53 51 4c 49 54 45  Page; ii<=SQLITE
13b60 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
13b70 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29  E_SIZE; ii=ii*2)
13b80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
13b90 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f  ( iDc&(SQLITE_IO
13ba0 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e  CAP_ATOMIC|(ii>>
13bb0 38 29 29 20 29 20 6e 44 65 66 61 75 6c 74 50 61  8)) ) nDefaultPa
13bc0 67 65 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  ge = ii;.       
13bd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23     }.        }.#
13be0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
13bf0 28 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3e 53  ( nDefaultPage>S
13c00 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
13c10 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
13c20 20 20 20 20 20 20 20 20 20 6e 44 65 66 61 75 6c           nDefaul
13c30 74 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f 4d  tPage = SQLITE_M
13c40 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
13c50 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  SIZE;.        }.
13c60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13c70 7d 65 6c 73 65 20 69 66 28 20 21 6d 65 6d 44 62  }else if( !memDb
13c80 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
13c90 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
13ca0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
13cb0 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
13cc0 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
13cd0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
13ce0 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
13cf0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
13d00 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
13d10 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
13d20 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
13d30 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
13d40 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
13d50 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c   */ .    tempFil
13d60 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
13d70 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
13d80 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a  _EXCLUSIVE;.  }.
13d90 0a 20 20 69 66 28 20 70 50 61 67 65 72 20 26 26  .  if( pPager &&
13da0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13db0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54  {.    pPager->pT
13dc0 6d 70 53 70 61 63 65 20 3d 20 28 63 68 61 72 20  mpSpace = (char 
13dd0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
13de0 28 6e 44 65 66 61 75 6c 74 50 61 67 65 29 3b 0a  (nDefaultPage);.
13df0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
13e00 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e  error occured in
13e10 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62   either of the b
13e20 6c 6f 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20 2a  locks above..  *
13e30 2a 20 46 72 65 65 20 74 68 65 20 50 61 67 65 72  * Free the Pager
13e40 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63   structure and c
13e50 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20  lose the file.. 
13e60 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 70 61   ** Since the pa
13e70 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63  ger is not alloc
13e80 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f  ated there is no
13e90 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20   need to set .  
13ea0 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72  ** any Pager.err
13eb0 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a  Mask variables..
13ec0 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67    */.  if( !pPag
13ed0 65 72 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70  er || !pPager->p
13ee0 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
13ef0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
13f00 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
13f10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
13f20 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
13f30 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ((rc==SQLITE_OK
13f40 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72  )?SQLITE_NOMEM:r
13f50 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  c);.  }..  PAGER
13f60 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20  TRACE3("OPEN %d 
13f70 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
13f80 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
13f90 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
13fa0 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  me);.  IOTRACE((
13fb0 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
13fc0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
13fd0 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 2f  zFilename))..  /
13fe0 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e  * Fill in Pager.
13ff0 7a 44 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a  zDirectory[] */.
14000 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
14010 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 70 50 61  >zDirectory, pPa
14020 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
14030 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  nPathname+1);.  
14040 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 70 50 61  for(i=strlen(pPa
14050 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29  ger->zDirectory)
14060 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d  ; i>0 && pPager-
14070 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
14080 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='/'; i--){}.  
14090 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72  if( i>0 ) pPager
140a0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
140b0 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ] = 0;..  /* Fil
140c0 6c 20 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72  l in Pager.zJour
140d0 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70  nal[] */.  memcp
140e0 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
140f0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  al, pPager->zFil
14100 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  ename, nPathname
14110 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61  );.  memcpy(&pPa
14120 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
14130 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
14140 6e 61 6c 22 2c 20 39 29 3b 0a 0a 20 20 2f 2a 20  nal", 9);..  /* 
14150 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14160 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  pen = 0; */.  pP
14170 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
14180 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26   = useJournal &&
14190 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65   !memDb;.  pPage
141a0 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  r->noReadlock = 
141b0 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65  noReadlock && re
141c0 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
141d0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
141e0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
141f0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
14200 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
14210 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
14220 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
14230 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61  = memDb-1;.  pPa
14240 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
14250 6e 44 65 66 61 75 6c 74 50 61 67 65 3b 0a 20 20  nDefaultPage;.  
14260 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
14270 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
14280 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
14290 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
142a0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
142b0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
142c0 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20  mxPage = 100;.  
142d0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
142e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
142f0 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
14300 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
14310 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
14320 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14330 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69  state == (tempFi
14340 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55  le ? PAGER_EXCLU
14350 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c  SIVE : PAGER_UNL
14360 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61  OCK) );.  /* pPa
14370 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
14380 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
14390 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69  empFile = tempFi
143a0 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
143b0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
143c0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
143d0 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
143e0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
143f0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
14400 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
14410 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
14420 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
14430 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
14440 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65  clusiveMode = te
14450 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
14460 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62  r->memDb = memDb
14470 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
14480 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b  Only = readOnly;
14490 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65  .  /* pPager->ne
144a0 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20  edSync = 0; */. 
144b0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
144c0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
144d0 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61  le || !useJourna
144e0 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  l;.  pPager->ful
144f0 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d  lSync = (pPager-
14500 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20  >noSync?0:1);.  
14510 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
14520 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
14530 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50  _NORMAL;.  /* pP
14540 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
14550 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
14560 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
14570 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
14580 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
14590 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
145a0 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e  ra = FORCE_ALIGN
145b0 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20  MENT(nExtra);.  
145c0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
145d0 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 6d 65 6d  d->pMethods||mem
145e0 44 62 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20  Db||tempFile);. 
145f0 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20   if( !memDb ){. 
14600 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
14610 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
14620 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
14630 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
14640 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
14650 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
14660 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
14670 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61  sh)); */.  *ppPa
14680 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69  ger = pPager;.#i
14690 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
146a0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
146b0 4d 45 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 69  MENT.  pPager->i
146c0 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 70  InUseMM = 0;.  p
146d0 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 20  Pager->iInUseDB 
146e0 3d 20 30 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44  = 0;.  if( !memD
146f0 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
14700 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20  _mutex *mutex = 
14710 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
14720 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
14730 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20  _STATIC_MEM2);. 
14740 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14750 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20  _enter(mutex);. 
14760 20 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74     pPager->pNext
14770 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
14780 69 73 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ist;.    if( sql
14790 69 74 65 33 50 61 67 65 72 4c 69 73 74 20 29 7b  ite3PagerList ){
147a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
147b0 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d  qlite3PagerList-
147c0 3e 70 50 72 65 76 3d 3d 30 20 29 3b 0a 20 20 20  >pPrev==0 );.   
147d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c     sqlite3PagerL
147e0 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 61  ist->pPrev = pPa
147f0 67 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ger;.    }.    p
14800 50 61 67 65 72 2d 3e 70 50 72 65 76 20 3d 20 30  Pager->pPrev = 0
14810 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
14820 65 72 4c 69 73 74 20 3d 20 70 50 61 67 65 72 3b  erList = pPager;
14830 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
14840 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b  ex_leave(mutex);
14850 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
14860 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14870 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
14880 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
14890 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
148a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
148b0 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
148c0 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
148d0 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
148e0 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
148f0 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
14900 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
14910 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
14920 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
14930 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
14940 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
14950 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
14960 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
14970 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
14980 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
14990 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
149a0 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
149b0 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
149c0 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
149d0 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
149e0 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
149f0 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
14a00 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
14a10 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
14a20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
14a30 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a  PagerClose().  .
14a40 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
14a50 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
14a60 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  y sqlite3PagerUn
14a70 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
14a80 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 65  qlite3PagerSetDe
14a90 73 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a  structor(Pager *
14aa0 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
14ab0 44 65 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e  Desc)(DbPage*,in
14ac0 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
14ad0 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65  Destructor = xDe
14ae0 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  sc;.}../*.** Set
14af0 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
14b00 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
14b10 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
14b20 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
14b30 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
14b40 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
14b50 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
14b60 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
14b70 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
14b80 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
14b90 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
14ba0 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
14bb0 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
14bc0 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
14bd0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
14be0 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
14bf0 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
14c00 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
14c10 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
14c20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14c30 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65  3PagerSetReinite
14c40 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
14c50 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
14c60 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a  (DbPage*,int)){.
14c70 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
14c80 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
14c90 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
14ca0 70 61 67 65 20 73 69 7a 65 20 74 6f 20 2a 70 50  page size to *pP
14cb0 61 67 65 53 69 7a 65 2e 20 49 66 20 74 68 65 20  ageSize. If the 
14cc0 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65  suggest new page
14cd0 20 73 69 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70   size is.** inap
14ce0 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20  propriate, then 
14cf0 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
14d00 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
14d10 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65  to that.** value
14d20 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
14d30 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
14d40 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
14d50 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
14d60 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29   u16 *pPageSize)
14d70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14d80 49 54 45 5f 4f 4b 3b 0a 20 20 75 31 36 20 70 61  ITE_OK;.  u16 pa
14d90 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
14da0 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ize;.  assert( p
14db0 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
14dc0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
14dd0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
14de0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
14df0 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
14e00 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70  e && pageSize!=p
14e10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
14e20 0a 20 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e  .   && !pPager->
14e30 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d  memDb && pPager-
14e40 3e 6e 52 65 66 3d 3d 30 20 0a 20 20 29 7b 0a 20  >nRef==0 .  ){. 
14e50 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
14e60 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
14e70 6d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  malloc(pageSize)
14e80 3b 0a 20 20 20 20 69 66 28 20 21 70 4e 65 77 20  ;.    if( !pNew 
14e90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
14ea0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
14eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67  }else{.      pag
14ec0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
14ed0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
14ee0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
14ef0 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
14f00 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
14f10 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69       setSectorSi
14f20 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
14f30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14f40 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
14f50 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
14f60 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
14f70 77 3b 0a 20 20 20 20 20 20 70 61 67 65 72 4c 65  w;.      pagerLe
14f80 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
14f90 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 61 67 65 53   }.  }.  *pPageS
14fa0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
14fb0 67 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  geSize;.  return
14fc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
14fd0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
14fe0 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
14ff0 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
15000 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
15010 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
15020 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
15030 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
15040 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
15050 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
15060 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
15070 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
15080 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
15090 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
150a0 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
150b0 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
150c0 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
150d0 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
150e0 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
150f0 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
15100 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
15110 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
15120 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
15130 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
15140 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
15150 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
15160 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
15170 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
15180 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
15190 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
151a0 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
151b0 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
151c0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
151d0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
151e0 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
151f0 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
15200 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
15210 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
15220 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
15230 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
15240 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
15250 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
15260 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
15270 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
15280 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
15290 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
152a0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
152b0 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
152c0 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
152d0 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
152e0 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
152f0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
15300 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ge;.  }.  sqlite
15310 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
15320 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
15330 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
15340 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
15350 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
15360 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
15370 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
15380 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
15390 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
153a0 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
153b0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
153c0 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
153d0 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
153e0 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
153f0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
15400 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
15410 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
15420 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
15430 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
15440 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
15450 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
15460 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
15470 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
15480 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
15490 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
154a0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
154b0 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
154c0 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
154d0 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
154e0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
154f0 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
15500 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
15510 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
15520 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
15530 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
15540 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
15550 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
15560 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
15570 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
15580 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
15590 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
155a0 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
155b0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
155c0 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
155d0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
155e0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
155f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
15600 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
15610 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
15620 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
15630 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
15640 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
15650 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65   to. .**.** No e
15660 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73  rror checking is
15670 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f   done. The ratio
15680 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20  nal for this is 
15690 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
156a0 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61  on .** may be ca
156b0 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  lled even if the
156c0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
156d0 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20  xist or contain 
156e0 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a  a header. In .**
156f0 20 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c   these cases sql
15700 69 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c  ite3OsRead() wil
15710 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  l return an erro
15720 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  r, to which the 
15730 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70  correct .** resp
15740 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20  onse is to zero 
15750 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44  the memory at pD
15760 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65  est and continue
15770 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72  .  A real IO err
15780 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73  or .** will pres
15790 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64  umably recur and
157a0 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61   be picked up la
157b0 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b  ter (Todo: Think
157c0 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f   about this)..*/
157d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
157e0 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
157f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
15800 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
15810 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
15820 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15830 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
15840 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
15850 72 74 28 4d 45 4d 44 42 7c 7c 70 50 61 67 65 72  rt(MEMDB||pPager
15860 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
15870 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
15880 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
15890 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
158a0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
158b0 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
158c0 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
158d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
158e0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
158f0 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20  pDest, N, 0);.  
15900 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15910 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
15920 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
15930 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
15940 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15960 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
15970 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
15980 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73  he disk file ass
15990 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
159a0 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49  pPager. .**.** I
159b0 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59  f the PENDING_BY
159c0 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70  TE lies on the p
159d0 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74  age directly aft
159e0 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  er the end of th
159f0 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  e.** file, then 
15a00 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61  consider this pa
15a10 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  ge part of the f
15a20 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61  ile too. For exa
15a30 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44  mple, if.** PEND
15a40 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65  ING_BYTE is byte
15a50 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74   4096 (the first
15a60 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29   byte of page 5)
15a70 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
15a80 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
15a90 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73  4096 bytes, 5 is
15aa0 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
15ab0 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73  d of 4..*/.int s
15ac0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
15ad0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
15ae0 65 72 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30  er){.  i64 n = 0
15af0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
15b00 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
15b10 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
15b20 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
15b30 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
15b40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
15b50 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20  ize>=0 ){.    n 
15b60 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
15b70 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
15b80 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
15b90 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
15ba0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
15bb0 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72  .    if( (pPager
15bc0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  ->fd->pMethods).
15bd0 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71       && (rc = sq
15be0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
15bf0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29  pPager->fd, &n))
15c00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15c10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
15c20 66 2b 2b 3b 0a 20 20 20 20 20 20 70 61 67 65 72  f++;.      pager
15c30 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
15c40 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  c);.      pPager
15c50 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20  ->nRef--;.      
15c60 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
15c70 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
15c80 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
15c90 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  ze ){.      n = 
15ca0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
15cb0 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d      n /= pPager-
15cc0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
15cd0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
15ce0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
15cf0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
15d00 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
15d10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
15d20 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59  ( n==(PENDING_BY
15d30 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
15d40 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  ize) ){.    n++;
15d50 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61  .  }.  if( n>pPa
15d60 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
15d70 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
15d80 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  o = n;.  }.  ret
15d90 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  urn n;.}...#ifnd
15da0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
15db0 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c  EMORYDB./*.** Cl
15dc0 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
15dd0 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
15de0 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
15df0 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
15e00 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  st){.  sqlite3_f
15e10 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  ree(pHist->pOrig
15e20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
15e30 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
15e40 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  .  pHist->pOrig 
15e50 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53  = 0;.  pHist->pS
15e60 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  tmt = 0;.}.#else
15e70 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69  .#define clearHi
15e80 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a  story(x).#endif.
15e90 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
15ea0 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
15eb0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
15ec0 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f  rnal(Pager*);../
15ed0 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20  *.** Unlink pPg 
15ee0 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68  from its hash ch
15ef0 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68  ain. Also set th
15f00 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  e page number to
15f10 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a   0 to indicate.*
15f20 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
15f30 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
15f40 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54  ny hash chain. T
15f50 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
15f60 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73  because the.** s
15f70 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
15f80 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61  age() routine ca
15f90 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69  n leave a page i
15fa0 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46  n the .** pNextF
15fb0 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69  ree/pPrevFree li
15fc0 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  st that is not a
15fd0 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73   part of any has
15fe0 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  h-chain..*/.stat
15ff0 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61  ic void unlinkHa
16000 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70  shChain(Pager *p
16010 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
16020 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  g){.  if( pPg->p
16030 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  gno==0 ){.    as
16040 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
16050 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Hash==0 && pPg->
16060 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
16070 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
16080 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
16090 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d  Hash ){.    pPg-
160a0 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
160b0 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  vHash = pPg->pPr
160c0 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66  evHash;.  }.  if
160d0 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  ( pPg->pPrevHash
160e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
160f0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50  pPager->aHash[pP
16100 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65  g->pgno & (pPage
16110 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50  r->nHash-1)]!=pP
16120 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
16130 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61  revHash->pNextHa
16140 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  sh = pPg->pNextH
16150 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ash;.  }else{.  
16160 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70    int h = pPg->p
16170 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
16180 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 61  Hash-1);.    pPa
16190 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
161a0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
161b0 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20    }.  if( MEMDB 
161c0 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73 74  ){.    clearHist
161d0 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
161e0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
161f0 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f  .  }.  pPg->pgno
16200 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65   = 0;.  pPg->pNe
16210 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  xtHash = pPg->pP
16220 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a  revHash = 0;.}..
16230 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70  /*.** Unlink a p
16240 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
16250 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74  e list (the list
16260 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68   of all pages wh
16270 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20  ere nRef==0).** 
16280 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73  and from its has
16290 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
162a0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
162b0 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48  d unlinkPage(PgH
162c0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
162d0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
162e0 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 55  >pPager;..  /* U
162f0 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66 72 65 65 20  nlink from free 
16300 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 6c  page list */.  l
16310 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67  ruListRemove(pPg
16320 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  );..  /* Unlink 
16330 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61  from the pgno ha
16340 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e  sh table */.  un
16350 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
16360 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f  ager, pPg);.}../
16370 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16380 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
16390 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65 20  ncate the cache 
163a0 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 0a  when a database.
163b0 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65 64 2e  ** is truncated.
163c0 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68 65 20    Drop from the 
163d0 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65 73 20  cache all pages 
163e0 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a  whose pgno is.**
163f0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
16400 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20  ger->dbSize and 
16410 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e  is unreferenced.
16420 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
16430 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74  d pages larger t
16440 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
16450 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ze are zeroed..*
16460 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61  *.** Actually, a
16470 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73  t the point this
16480 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
16490 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62 65 0a  ed, it would be.
164a0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 68  ** an error to h
164b0 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65 64  ave a referenced
164c0 20 70 61 67 65 2e 20 20 42 75 74 20 72 61 74 68   page.  But rath
164d0 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a  er than delete.*
164e0 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e 64 20  * that page and 
164f0 67 75 61 72 61 6e 74 65 65 20 61 20 73 75 62 73  guarantee a subs
16500 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c 74 2c  equent segfault,
16510 20 69 74 20 73 65 65 6d 73 20 62 65 74 74 65 72   it seems better
16520 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20 61  .** to zero it a
16530 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77 65 20  nd hope that we 
16540 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79  error out sanely
16550 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16560 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
16570 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
16580 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
16590 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70  Pg;.  PgHdr **pp
165a0 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  Pg;.  int dbSize
165b0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
165c0 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50  e;..  ppPg = &pP
165d0 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68  ager->pAll;.  wh
165e0 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50  ile( (pPg = *ppP
165f0 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  g)!=0 ){.    if(
16600 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69   pPg->pgno<=dbSi
16610 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67  ze ){.      ppPg
16620 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
16630 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
16640 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a   pPg->nRef>0 ){.
16650 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
16660 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
16670 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
16680 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50  Size);.      ppP
16690 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
166a0 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
166b0 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67       *ppPg = pPg
166c0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
166d0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46 52    IOTRACE(("PGFR
166e0 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  EE %p %d\n", pPa
166f0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
16700 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
16710 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
16720 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a  _pgfree_count);.
16730 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65        unlinkPage
16740 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b  (pPg);.      mak
16750 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
16760 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16770 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  pPg->pData);.   
16780 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16790 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pPg);.      pPag
167a0 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20  er->nPage--;.   
167b0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
167c0 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
167d0 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20  lock on a file. 
167e0 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
167f0 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
16800 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72   lock.** is curr
16810 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
16820 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74  ble.  Repeat unt
16830 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
16840 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20  back returns.** 
16850 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
16860 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
16870 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
16880 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
16890 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
168a0 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
168b0 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
168c0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
168d0 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
168e0 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
168f0 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
16900 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ype){.  int rc;.
16910 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63  .  /* The OS loc
16920 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  k values must be
16930 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
16940 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75   Pager lock valu
16950 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
16960 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48  PAGER_SHARED==SH
16970 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
16980 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53  ssert( PAGER_RES
16990 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f  ERVED==RESERVED_
169a0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
169b0 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ( PAGER_EXCLUSIV
169c0 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  E==EXCLUSIVE_LOC
169d0 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
169e0 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e  e file is curren
169f0 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65  tly unlocked the
16a00 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20  n the size must 
16a10 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20  be unknown */.  
16a20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16a30 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
16a40 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  RED || pPager->d
16a50 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42  bSize<0 || MEMDB
16a60 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
16a70 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
16a80 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
16a90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
16aa0 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e{.    if( pPage
16ab0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
16ac0 29 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  ) pPager->pBusyH
16ad0 61 6e 64 6c 65 72 2d 3e 6e 42 75 73 79 20 3d 20  andler->nBusy = 
16ae0 30 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  0;.    do {.    
16af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16b00 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
16b10 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
16b20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
16b30 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74  TE_BUSY && sqlit
16b40 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
16b50 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
16b60 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20  yHandler) );.   
16b70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16b80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
16b90 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b  er->state = lock
16ba0 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52  type;.      IOTR
16bb0 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64  ACE(("LOCK %p %d
16bc0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63  \n", pPager, loc
16bd0 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20  ktype)).    }.  
16be0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
16bf0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
16c00 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65   the file to the
16c10 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
16c20 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69   specified..*/.i
16c30 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  nt sqlite3PagerT
16c40 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
16c50 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
16c60 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
16c70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16c80 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
16c90 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a  RED || MEMDB );.
16ca0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
16cb0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
16cc0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
16cd0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
16ce0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
16cf0 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  de;.    return r
16d00 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  c;.  }.  if( nPa
16d10 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50  ge>=(unsigned)pP
16d20 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
16d30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16d40 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
16d50 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
16d60 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
16d70 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74  age;.    pager_t
16d80 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
16d90 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
16da0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16db0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
16dc0 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 79  ager);.  rc = sy
16dd0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
16de0 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
16df0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
16e00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16e10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16e20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20   }..  /* Get an 
16e30 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
16e40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
16e50 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
16e60 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45 6e 74 65  . */.  pagerEnte
16e70 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  r(pPager);.  rc 
16e80 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
16e90 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
16ea0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
16eb0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
16ec0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
16ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16ee0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
16ef0 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
16f00 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61  cate(pPager, nPa
16f10 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
16f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
16f30 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
16f40 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
16f50 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
16f60 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
16f70 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
16f80 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
16f90 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
16fa0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
16fb0 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
16fc0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
16fd0 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
16fe0 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
16ff0 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
17000 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
17010 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
17020 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
17030 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
17040 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
17050 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
17060 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
17070 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
17080 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
17090 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
170a0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
170b0 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
170c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
170d0 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
170e0 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
170f0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
17100 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
17110 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
17120 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
17130 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
17140 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
17150 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
17160 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
17170 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
17180 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
17190 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
171a0 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20 53  Pager){.#ifdef S
171b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
171c0 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
171d0 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
171e0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
171f0 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65   *mutex = sqlite
17200 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
17210 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
17220 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 73 71 6c  C_MEM2);.    sql
17230 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
17240 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 69 66 28  (mutex);.    if(
17250 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 20 29   pPager->pPrev )
17260 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
17270 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
17280 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Pager->pNext;.  
17290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
172a0 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20  qlite3PagerList 
172b0 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
172c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
172d0 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 29 7b 0a  Pager->pNext ){.
172e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4e        pPager->pN
172f0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 61  ext->pPrev = pPa
17300 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ger->pPrev;.    
17310 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  }.    sqlite3_mu
17320 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29  tex_leave(mutex)
17330 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
17340 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
17350 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
17360 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17370 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
17380 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
17390 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
173a0 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
173b0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
173c0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e  ck(pPager);.  en
173d0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
173e0 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
173f0 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45  GERTRACE2("CLOSE
17400 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
17410 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52  pPager));.  IOTR
17420 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
17430 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 61 73  ", pPager)).  as
17440 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
17450 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72  rCode || (pPager
17460 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
17470 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   && pPager->stmt
17480 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66  Open==0) );.  if
17490 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
174a0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
174b0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
174c0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  er->jfd);.  }.  
174d0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
174e0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
174f0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
17500 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
17510 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
17520 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
17530 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  tfd);.  }.  sqli
17540 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
17550 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d  r->fd);.  /* Tem
17560 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
17570 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
17580 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
17590 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
175a0 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
175b0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
175c0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
175d0 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
175e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
175f0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
17600 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17610 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
17620 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
17630 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
17640 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17650 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
17660 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
17670 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
17680 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17690 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
176a0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
176b0 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
176c0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
176d0 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a  ber(DbPage *p){.
176e0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
176f0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
17700 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29  * The page_ref()
17710 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d   function increm
17720 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  ents the referen
17730 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
17740 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70  age..** If the p
17750 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
17760 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
17770 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
17780 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
17790 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
177a0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
177b0 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  st..**.** For no
177c0 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  n-test systems, 
177d0 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20  page_ref() is a 
177e0 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73  macro that calls
177f0 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20   _page_ref().** 
17800 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  online of the re
17810 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
17820 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74   zero.  For test
17830 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
17840 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61  ef().** is a rea
17850 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68  l function so th
17860 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72  at we can set br
17870 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72  eakpoints and tr
17880 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ace it..*/.stati
17890 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
178a0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
178b0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
178c0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
178d0 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
178e0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
178f0 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
17900 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f  .    lruListRemo
17910 76 65 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  ve(pPg);.    pPg
17920 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b  ->pPager->nRef++
17930 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65  ;.  }.  pPg->nRe
17940 66 2b 2b 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  f++;.}.#ifdef SQ
17950 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61  LITE_DEBUG.  sta
17960 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
17970 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
17980 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
17990 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61  ==0 ){.      _pa
179a0 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20  ge_ref(pPg);.   
179b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
179c0 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  g->nRef++;.    }
179d0 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
179e0 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
179f0 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
17a00 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
17a10 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
17a20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
17a30 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
17a40 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
17a50 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
17a60 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
17a70 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
17a80 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
17a90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
17aa0 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
17ab0 67 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  g){.  pagerEnter
17ac0 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pPg->pPager);. 
17ad0 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
17ae0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67    pagerLeave(pPg
17af0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  ->pPager);.  ret
17b00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17b10 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
17b20 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
17b30 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
17b40 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
17b50 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
17b60 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
17b70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
17b80 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
17b90 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
17ba0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
17bb0 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
17bc0 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
17bd0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
17be0 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
17bf0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
17c00 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
17c10 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
17c20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
17c30 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
17c40 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
17c50 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
17c60 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
17c70 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
17c80 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
17c90 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
17ca0 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
17cb0 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
17cc0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
17cd0 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
17ce0 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
17cf0 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
17d00 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
17d10 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
17d20 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
17d30 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
17d40 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
17d50 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
17d60 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
17d70 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
17d80 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
17d90 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
17da0 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
17db0 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
17dc0 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
17dd0 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
17de0 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
17df0 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
17e00 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
17e10 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
17e20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
17e30 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
17e40 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
17e50 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
17e60 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
17e70 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
17e80 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
17e90 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73  failure, so no s
17ea0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
17eb0 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  * If the IOCAP_S
17ec0 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69  EQUENTIAL flag i
17ed0 73 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65  s set for the pe
17ee0 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f  rsistent media o
17ef0 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64  n which.** the d
17f00 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65  atabase is store
17f10 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29  d, then OsSync()
17f20 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
17f30 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   on the journal.
17f40 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  ** file. In this
17f50 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69   case all that i
17f60 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f  s required is to
17f70 20 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63   update the nRec
17f80 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65   field in.** the
17f90 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
17fa0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
17fb0 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
17fc0 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
17fd0 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
17fe0 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
17ff0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
18000 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
18010 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
18020 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
18030 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18040 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79 6e 63  _OK;...  /* Sync
18050 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
18060 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
18070 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
18080 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
18090 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
180a0 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
180b0 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
180c0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
180d0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
180e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
180f0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
18100 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
18110 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
18120 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
18130 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
18140 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
18150 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
18160 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
18170 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
18180 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
18190 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
181a0 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
181b0 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
181c0 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
181d0 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
181e0 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
181f0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
18200 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
18210 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
18220 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
18230 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
18240 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
18250 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
18260 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
18270 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
18280 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
18290 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
182a0 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20      i64 jSz;.   
182b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
182c0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
182d0 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a  er->jfd, &jSz);.
182e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
182f0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
18300 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
18310 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
18320 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20  f==jSz );.      
18330 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
18340 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
18350 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
18360 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
18370 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
18380 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
18390 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
183a0 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
183b0 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
183c0 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
183d0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
183e0 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
183f0 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
18400 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
18410 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
18420 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
18430 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
18440 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
18450 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
18460 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
18470 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
18480 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
18490 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
184a0 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
184b0 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
184c0 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
184d0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
184e0 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
184f0 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
18500 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
18510 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
18520 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
18530 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
18540 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
18550 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
18560 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
18570 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
18580 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
18590 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
185a0 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
185b0 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
185c0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
185d0 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f         i64 jrnlO
185e0 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ff;.        if( 
185f0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
18600 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
18610 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
18620 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
18630 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
18640 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
18650 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
18660 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
18670 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
18680 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
18690 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
186a0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
186b0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
186c0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
186d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
186e0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
186f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
18700 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70       jrnlOff = p
18710 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
18720 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
18730 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
18740 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
18750 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
18760 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66   pPager, jrnlOff
18770 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72  , 4));.        r
18780 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
18790 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
187a0 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52  lOff, pPager->nR
187b0 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
187c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
187d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
187e0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
187f0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
18800 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
18810 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
18820 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
18830 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
18840 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  r));.        IOT
18850 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
18860 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
18870 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18880 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
18890 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
188a0 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
188b0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
188c0 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
188d0 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
188e0 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
188f0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
18900 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
18910 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18920 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
18930 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
18940 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
18950 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
18960 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
18970 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
18980 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
18990 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
189a0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
189b0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
189c0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
189d0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
189e0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
189f0 20 20 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69      lruListSetFi
18a00 72 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72  rstSynced(pPager
18a10 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
18a20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
18a30 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
18a40 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  c flag is clear 
18a50 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e  then the PgHdr.n
18a60 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  eedSync.  ** fla
18a70 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63  g must also be c
18a80 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67  lear for all pag
18a90 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  es.  Verify that
18aa0 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72   this.  ** invar
18ab0 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20  iant is true..  
18ac0 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66  */.  else{.    f
18ad0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
18ae0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
18af0 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
18b00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
18b10 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
18b20 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
18b30 28 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  ( pPager->lru.pF
18b40 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67  irstSynced==pPag
18b50 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29  er->lru.pFirst )
18b60 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
18b70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18b80 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69  .** Merge two li
18b90 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e  sts of pages con
18ba0 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
18bb0 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64   and in pgno ord
18bc0 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f  er..** Do not bo
18bd0 74 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50  th fixing the pP
18be0 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72  revDirty pointer
18bf0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  s..*/.static PgH
18c00 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69  dr *merge_pageli
18c10 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67  st(PgHdr *pA, Pg
18c20 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64  Hdr *pB){.  PgHd
18c30 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c  r result, *pTail
18c40 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73  ;.  pTail = &res
18c50 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41  ult;.  while( pA
18c60 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66   && pB ){.    if
18c70 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70  ( pA->pgno<pB->p
18c80 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61  gno ){.      pTa
18c90 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b  il->pDirty = pA;
18ca0 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70  .      pTail = p
18cb0 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41  A;.      pA = pA
18cc0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65  ->pDirty;.    }e
18cd0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c  lse{.      pTail
18ce0 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
18cf0 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b       pTail = pB;
18d00 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e  .      pB = pB->
18d10 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
18d20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20  }.  if( pA ){.  
18d30 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
18d40 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = pA;.  }else if
18d50 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69  ( pB ){.    pTai
18d60 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a  l->pDirty = pB;.
18d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
18d80 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  il->pDirty = 0;.
18d90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
18da0 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f  ult.pDirty;.}../
18db0 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69  *.** Sort the li
18dc0 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  st of pages in a
18dd0 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  ccending order b
18de0 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61  y pgno.  Pages a
18df0 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  re.** connected 
18e00 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65  by pDirty pointe
18e10 72 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69  rs.  The pPrevDi
18e20 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65  rty pointers are
18e30 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79  .** corrupted by
18e40 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23   this sort..*/.#
18e50 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
18e60 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64  CKET_ALLOC 25.#d
18e70 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
18e80 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23 69 66  KET       25.#if
18e90 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
18ea0 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61    int sqlite3_pa
18eb0 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
18ec0 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20  t = 0;.  #undef 
18ed0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20  N_SORT_BUCKET.  
18ee0 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
18ef0 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69  UCKET \.   (sqli
18f00 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74  te3_pager_n_sort
18f10 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f  _bucket?sqlite3_
18f20 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
18f30 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ket:N_SORT_BUCKE
18f40 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a  T_ALLOC).#endif.
18f50 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f  static PgHdr *so
18f60 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  rt_pagelist(PgHd
18f70 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72  r *pIn){.  PgHdr
18f80 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45   *a[N_SORT_BUCKE
18f90 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20  T_ALLOC], *p;.  
18fa0 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28  int i;.  memset(
18fb0 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29  a, 0, sizeof(a))
18fc0 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29  ;.  while( pIn )
18fd0 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20  {.    p = pIn;. 
18fe0 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72     pIn = p->pDir
18ff0 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74  ty;.    p->pDirt
19000 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  y = 0;.    for(i
19010 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43  =0; i<N_SORT_BUC
19020 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  KET-1; i++){.   
19030 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29     if( a[i]==0 )
19040 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d  {.        a[i] =
19050 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   p;.        brea
19060 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
19070 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67          p = merg
19080 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c  e_pagelist(a[i],
19090 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69   p);.        a[i
190a0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
190b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
190c0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20  N_SORT_BUCKET-1 
190d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65  ){.      /* Cove
190e0 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72  rage: To get her
190f0 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f  e, there need to
19100 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55   be 2^(N_SORT_BU
19110 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20  CKET) .      ** 
19120 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
19130 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73  input list. This
19140 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75   is possible, bu
19150 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20  t impractical.. 
19160 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20       ** Testing 
19170 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65  this line is the
19180 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c   point of global
19190 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20   variable.      
191a0 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  ** sqlite3_pager
191b0 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a  _n_sort_bucket..
191c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
191d0 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65  [i] = merge_page
191e0 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
191f0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61     }.  }.  p = a
19200 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  [0];.  for(i=1; 
19210 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b  i<N_SORT_BUCKET;
19220 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d   i++){.    p = m
19230 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c  erge_pagelist(p,
19240 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65   a[i]);.  }.  re
19250 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
19260 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66   Given a list of
19270 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65   pages (connecte
19280 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  d by the PgHdr.p
19290 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77  Dirty pointer) w
192a0 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e  rite.** every on
192b0 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
192c0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
192d0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61  base file and ma
192e0 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61  rk them all.** a
192f0 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74  s clean..*/.stat
19300 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
19310 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
19320 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
19330 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 50 67  er *pPager;.  Pg
19340 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  Hdr *p;.  int rc
19350 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ;..  if( pList==
19360 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
19370 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
19380 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
19390 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
193a0 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
193b0 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
193c0 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
193d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
193e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
193f0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
19400 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
19410 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
19420 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20  wing.  ** calls 
19430 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  to sqlite3OsLock
19440 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20  () are no-ops.. 
19450 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
19460 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
19470 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
19480 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
19490 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
194a0 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
194b0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
194c0 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
194d0 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
194e0 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
194f0 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
19500 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
19510 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
19520 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
19530 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
19540 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
19550 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
19560 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
19570 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
19580 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
19590 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
195a0 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
195b0 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
195c0 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
195d0 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
195e0 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
195f0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
19600 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
19610 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
19620 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
19630 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
19640 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
19650 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
19660 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
19670 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
19680 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
19690 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
196a0 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
196b0 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
196c0 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
196d0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
196e0 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
196f0 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
19700 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
19710 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
19720 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
19730 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
19740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19750 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
19760 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74  ..  pList = sort
19770 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29  _pagelist(pList)
19780 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
19790 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
197a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
197b0 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 70 2d  >dirty );.    p-
197c0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  >dirty = 0;.  }.
197d0 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
197e0 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  {..    /* If the
197f0 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
19800 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
19810 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
19820 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
19830 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
19840 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
19850 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
19860 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19870 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
19880 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
19890 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
198a0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  ->zFilename,.   
198b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
198d0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
198e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
198f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
19900 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
19910 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
19920 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
19930 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
19940 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
19950 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
19960 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
19970 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
19980 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
19990 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
199a0 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
199b0 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
199c0 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
199d0 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
199e0 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
199f0 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
19a00 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
19a10 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
19a20 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
19a30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
19a40 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70  fset = (pList->p
19a50 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
19a60 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
19a70 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
19a80 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
19a90 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
19aa0 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
19ab0 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41  no, 6);.      PA
19ac0 47 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45  GERTRACE4("STORE
19ad0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
19ae0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
19af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
19b00 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
19b10 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65  List->pgno, page
19b20 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
19b30 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
19b40 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
19b50 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73  n", pPager, pLis
19b60 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  t->pgno));.     
19b70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
19b80 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
19b90 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
19ba0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
19bb0 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
19bc0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
19bd0 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
19be0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
19bf0 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
19c00 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
19c10 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  ist->pgno==1 ){.
19c20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
19c30 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
19c40 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
19c50 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
19c60 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
19c70 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
19c80 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
19c90 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
19ca0 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
19cb0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
19cc0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
19cd0 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
19ce0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
19cf0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
19d00 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
19d10 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
19d20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
19d30 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
19d40 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
19d50 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
19d60 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
19d70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19d80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
19d90 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
19da0 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
19db0 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
19dc0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
19dd0 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
19de0 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
19df0 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
19e00 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
19e10 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
19e20 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
19e30 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
19e40 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
19e50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
19e60 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
19e70 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 73   /* Verify the s
19e80 61 6e 69 74 79 20 6f 66 20 74 68 65 20 64 69 72  anity of the dir
19e90 74 79 20 6c 69 73 74 20 77 68 65 6e 20 77 65 20  ty list when we 
19ea0 61 72 65 20 72 75 6e 6e 69 6e 67 0a 20 20 2a 2a  are running.  **
19eb0 20 69 6e 20 64 65 62 75 67 67 69 6e 67 20 6d 6f   in debugging mo
19ec0 64 65 2e 20 20 54 68 69 73 20 69 73 20 65 78 70  de.  This is exp
19ed0 65 6e 73 69 76 65 2c 20 73 6f 20 64 6f 20 6e 6f  ensive, so do no
19ee0 74 0a 20 20 2a 2a 20 64 6f 20 74 68 69 73 20 6f  t.  ** do this o
19ef0 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  n a normal build
19f00 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 20 3d 20  . */.  int n1 = 
19f10 30 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 30 3b  0;.  int n2 = 0;
19f20 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 66  .  PgHdr *p;.  f
19f30 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
19f40 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
19f50 41 6c 6c 29 7b 20 69 66 28 20 70 2d 3e 64 69 72  All){ if( p->dir
19f60 74 79 20 29 20 6e 31 2b 2b 3b 20 7d 0a 20 20 66  ty ) n1++; }.  f
19f70 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 44 69  or(p=pPager->pDi
19f80 72 74 79 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  rty; p; p=p->pDi
19f90 72 74 79 29 7b 20 6e 32 2b 2b 3b 20 7d 0a 20 20  rty){ n2++; }.  
19fa0 61 73 73 65 72 74 28 20 6e 31 3d 3d 6e 32 20 29  assert( n1==n2 )
19fb0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  ;.#endif..  retu
19fc0 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74  rn pPager->pDirt
19fd0 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
19fe0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 72 65  rn TRUE if there
19ff0 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
1a000 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  l on the given p
1a010 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a  ager..** A hot j
1a020 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
1a030 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  at needs to be p
1a040 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  layed back..**.*
1a050 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
1a060 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1a070 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
1a080 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
1a090 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
1a0a0 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
1a0b0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
1a0c0 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
1a0d0 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
1a0e0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
1a0f0 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74  ame.  Just delet
1a100 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
1a110 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
1a120 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
1a130 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
1a140 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
1a150 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
1a160 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73   if( !pPager->us
1a170 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72  eJournal ) retur
1a180 6e 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  n 0;.  if( !pPag
1a190 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1a1a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1a1b0 66 28 20 21 73 71 6c 69 74 65 33 4f 73 41 63 63  f( !sqlite3OsAcc
1a1c0 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
1a1d0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
1a1e0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1a1f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1a200 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
1a210 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
1a220 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
1a230 66 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  fd) ){.    retur
1a240 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
1a250 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1a260 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20  ount(pPager)==0 
1a270 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
1a280 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
1a290 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
1a2a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1a2b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1a2c0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 1;.  }.}../
1a2d0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64  *.** Try to find
1a2e0 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 63   a page in the c
1a2f0 61 63 68 65 20 74 68 61 74 20 63 61 6e 20 62 65  ache that can be
1a300 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a   recycled. .**.*
1a310 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
1a320 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1a330 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46  _IOERR, SQLITE_F
1a340 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b  ULL or SQLITE_OK
1a350 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  . It .** does no
1a360 74 20 73 65 74 20 74 68 65 20 70 50 61 67 65 72  t set the pPager
1a370 2d 3e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  ->errCode variab
1a380 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1a390 74 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  t pager_recycle(
1a3a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1a3b0 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20  gHdr **ppPg){.  
1a3c0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70  PgHdr *pPg;.  *p
1a3d0 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  pPg = 0;..  /* I
1a3e0 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
1a3f0 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
1a400 6f 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 70 61  on unless the pa
1a410 67 65 72 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20  ger object.  ** 
1a420 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 50  pointed to by pP
1a430 61 67 65 72 20 68 61 73 20 61 74 20 6c 65 61 73  ager has at leas
1a440 74 20 6f 6e 65 20 66 72 65 65 20 70 61 67 65 20  t one free page 
1a450 28 70 61 67 65 20 77 69 74 68 20 6e 52 65 66 3d  (page with nRef=
1a460 3d 30 29 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  =0)..  */ .  ass
1a470 65 72 74 28 21 4d 45 4d 44 42 29 3b 0a 20 20 61  ert(!MEMDB);.  a
1a480 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72  ssert(pPager->lr
1a490 75 2e 70 46 69 72 73 74 29 3b 0a 0a 20 20 2f 2a  u.pFirst);..  /*
1a4a0 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20   Find a page to 
1a4b0 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f  recycle.  Try to
1a4c0 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74   locate a page t
1a4d0 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a  hat does not.  *
1a4e0 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20  * require us to 
1a4f0 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e  do an fsync() on
1a500 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20   the journal..  
1a510 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65  */.  pPg = pPage
1a520 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e  r->lru.pFirstSyn
1a530 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ced;..  /* If we
1a540 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
1a550 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
1a560 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20   not require an 
1a570 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20  fsync().  ** on 
1a580 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a590 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20   then fsync the 
1a5a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
1a5b0 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65  his is a.  ** ve
1a5c0 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
1a5d0 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
1a5e0 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
1a5f0 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
1a600 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20   ** it can't be 
1a610 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  helped..  */.  i
1a620 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61  f( pPg==0 && pPa
1a630 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29  ger->lru.pFirst)
1a640 7b 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  {.    int iDc = 
1a650 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
1a660 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
1a670 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
1a680 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  int rc = syncJou
1a690 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1a6a0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1a6b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a6c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
1a6d0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1a6e0 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
1a6f0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1a700 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ND) ){.      /* 
1a710 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
1a720 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65  mode, write a ne
1a730 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  w journal header
1a740 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
1a750 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
1a760 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f   This is done to
1a770 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69   avoid ever modi
1a780 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a  fying a journal.
1a790 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20        ** header 
1a7a0 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64  that is involved
1a7b0 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
1a7c0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
1a7d0 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72  ave.      ** alr
1a7e0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1a7f0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
1a800 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68  e (in case the h
1a810 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a  eader is.      *
1a820 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74  * trashed when t
1a830 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
1a840 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20   updated)..     
1a850 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
1a860 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
1a870 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a880 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30  ->journalOff > 0
1a890 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1a8a0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
1a8b0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ync==0 );.      
1a8c0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
1a8d0 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
1a8e0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
1a8f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1a900 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1a910 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61 67  }.    pPg = pPag
1a920 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a  er->lru.pFirst;.
1a930 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
1a940 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
1a950 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
1a960 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
1a970 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69  ase file if it i
1a980 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20  s dirty..  */.  
1a990 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
1a9a0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1a9b0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1a9c0 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
1a9d0 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
1a9e0 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
1a9f0 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 1;.    pPg->p
1aa00 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72  Dirty = 0;.    r
1aa10 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
1aa20 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b  pagelist( pPg );
1aa30 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
1aa40 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 21  = 0;.    if( rc!
1aa50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1aa60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1aa70 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
1aa80 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30  t( pPg->dirty==0
1aa90 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1aaa0 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63   page we are rec
1aab0 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64  ycling is marked
1aac0 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   as alwaysRollba
1aad0 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65  ck, then.  ** se
1aae0 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77  t the global alw
1aaf0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
1ab00 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67  , thus disabling
1ab10 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
1ab20 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1ab30 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ck() optimizatio
1ab40 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f  n for the rest o
1ab50 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1ab60 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e  on..  ** It is n
1ab70 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74  ecessary to do t
1ab80 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20  his because the 
1ab90 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61  page marked alwa
1aba0 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  ysRollback.  ** 
1abb0 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65  might be reloade
1abc0 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d  d at a later tim
1abd0 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f  e but at that po
1abe0 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d  int we won't rem
1abf0 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  ember.  ** that 
1ac00 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c  is was marked al
1ac10 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54  waysRollback.  T
1ac20 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61  his means that a
1ac30 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20  ll pages must.  
1ac40 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
1ac50 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
1ac60 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e  rom here on out.
1ac70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
1ac80 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1ac90 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
1aca0 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b  "ALWAYS_ROLLBACK
1acb0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1acc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77  .    pPager->alw
1acd0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
1ace0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
1acf0 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66  k the old page f
1ad00 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
1ad10 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74  t and the hash t
1ad20 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69  able.  */.  unli
1ad30 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 61  nkPage(pPg);.  a
1ad40 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
1ad50 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67 20  ==0 );..  *ppPg 
1ad60 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20  = pPg;.  return 
1ad70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1ad80 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1ad90 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
1ada0 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  MENT./*.** This 
1adb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1adc0 65 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72  ed to free super
1add0 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c  fluous dynamical
1ade0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  ly allocated mem
1adf0 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74  ory.** held by t
1ae00 68 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e  he pager system.
1ae10 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   Memory in use b
1ae20 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67  y any SQLite pag
1ae30 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  er allocated.** 
1ae40 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  by the current t
1ae50 68 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c  hread may be sql
1ae60 69 74 65 33 5f 66 72 65 65 28 29 65 64 2e 0a 2a  ite3_free()ed..*
1ae70 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65  *.** nReq is the
1ae80 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1ae90 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69   of memory requi
1aea0 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d  red. Once this m
1aeb0 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  uch has.** been 
1aec0 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75  released, the fu
1aed0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
1aee0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1aef0 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
1af00 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65  mber .** of byte
1af10 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65  s of memory rele
1af20 61 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ased..*/.int sql
1af30 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73 65  ite3PagerRelease
1af40 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29  Memory(int nReq)
1af50 7b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65  {.  int nRelease
1af60 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
1af70 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f  /* Bytes of memo
1af80 72 79 20 72 65 6c 65 61 73 65 64 20 73 6f 20 66  ry released so f
1af90 61 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ar */.  sqlite3_
1afa0 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
1afb0 20 20 20 20 2f 2a 20 54 68 65 20 4d 45 4d 32 20      /* The MEM2 
1afc0 6d 75 74 65 78 20 2a 2f 0a 20 20 50 61 67 65 72  mutex */.  Pager
1afd0 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20   *pPager;       
1afe0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1aff0 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 72  oping over pager
1b000 73 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c  s */.  BusyHandl
1b010 65 72 20 2a 73 61 76 65 64 42 75 73 79 3b 20 20  er *savedBusy;  
1b020 20 20 20 2f 2a 20 53 61 76 65 64 20 63 6f 70 79     /* Saved copy
1b030 20 6f 66 20 74 68 65 20 62 75 73 79 20 68 61 6e   of the busy han
1b040 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  dler */.  int rc
1b050 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1b060 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20   /* Acquire the 
1b070 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e  memory-managemen
1b080 74 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20 6d  t mutex.  */.  m
1b090 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
1b0a0 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1b0b0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
1b0c0 45 4d 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  EM2);.  sqlite3_
1b0d0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
1b0e0 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e 61 6c  x);..  /* Signal
1b0f0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f   all database co
1b100 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 6d  nnections that m
1b110 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
1b120 20 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 68   wants.  ** to h
1b130 61 76 65 20 61 63 63 65 73 73 20 74 6f 20 74 68  ave access to th
1b140 65 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f 0a 20  e pagers..  */. 
1b150 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71 6c 69   for(pPager=sqli
1b160 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20 70 50  te3PagerList; pP
1b170 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70 50 61  ager; pPager=pPa
1b180 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ger->pNext){.   
1b190 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65    pPager->iInUse
1b1a0 4d 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 77  MM = 1;.  }..  w
1b1b0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1b1c0 5f 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30 20 7c  _OK && (nReq<0 |
1b1d0 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71  | nReleased<nReq
1b1e0 29 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  ) ){.    PgHdr *
1b1f0 70 50 67 3b 0a 20 20 20 20 50 67 48 64 72 20 2a  pPg;.    PgHdr *
1b200 70 52 65 63 79 63 6c 65 64 3b 0a 20 0a 20 20 20  pRecycled;. .   
1b210 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
1b220 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
1b230 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
1b240 72 65 71 75 69 72 65 20 61 20 73 79 6e 63 28 29  require a sync()
1b250 2e 20 49 66 0a 20 20 20 20 2a 2a 20 74 68 69 73  . If.    ** this
1b260 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1b270 2c 20 66 69 6e 64 20 6f 6e 65 20 74 68 61 74 20  , find one that 
1b280 64 6f 65 73 20 72 65 71 75 69 72 65 20 61 20 73  does require a s
1b290 79 6e 63 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ync()..    */.  
1b2a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b2b0 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75  enter(sqlite3_mu
1b2c0 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
1b2d0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
1b2e0 55 29 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73  U));.    pPg = s
1b2f0 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
1b300 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a  t.pFirstSynced;.
1b310 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26      while( pPg &
1b320 26 20 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  & (pPg->needSync
1b330 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d   || pPg->pPager-
1b340 3e 69 49 6e 55 73 65 44 42 29 20 29 7b 0a 20 20  >iInUseDB) ){.  
1b350 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67      pPg = pPg->g
1b360 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20  free.pNext;.    
1b370 7d 0a 20 20 20 20 69 66 28 20 21 70 50 67 20 29  }.    if( !pPg )
1b380 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71  {.      pPg = sq
1b390 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
1b3a0 2e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 77  .pFirst;.      w
1b3b0 68 69 6c 65 28 20 70 50 67 20 26 26 20 70 50 67  hile( pPg && pPg
1b3c0 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65  ->pPager->iInUse
1b3d0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  DB ){.        pP
1b3e0 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e 70  g = pPg->gfree.p
1b3f0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1b400 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1b410 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
1b420 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
1b430 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
1b440 54 49 43 5f 4c 52 55 29 29 3b 0a 0a 20 20 20 20  TIC_LRU));..    
1b450 2f 2a 20 49 66 20 70 50 67 3d 3d 30 2c 20 74 68  /* If pPg==0, th
1b460 65 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f  en the block abo
1b470 76 65 20 68 61 73 20 66 61 69 6c 65 64 20 74 6f  ve has failed to
1b480 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f 0a   find a page to.
1b490 20 20 20 20 2a 2a 20 72 65 63 79 63 6c 65 2e 20      ** recycle. 
1b4a0 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 74  In this case ret
1b4b0 75 72 6e 20 65 61 72 6c 79 20 2d 20 6e 6f 20 66  urn early - no f
1b4c0 75 72 74 68 65 72 20 6d 65 6d 6f 72 79 20 77 69  urther memory wi
1b4d0 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 6c  ll.    ** be rel
1b4e0 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eased..    */.  
1b4f0 20 20 69 66 28 20 21 70 50 67 20 29 20 62 72 65    if( !pPg ) bre
1b500 61 6b 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 20  ak;..    pPager 
1b510 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1b520 20 20 20 61 73 73 65 72 74 28 21 70 50 67 2d 3e     assert(!pPg->
1b530 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 3d  needSync || pPg=
1b540 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  =pPager->lru.pFi
1b550 72 73 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  rst);.    assert
1b560 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c  (pPg->needSync |
1b570 7c 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c  | pPg==pPager->l
1b580 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 29  ru.pFirstSynced)
1b590 3b 0a 20 20 0a 20 20 20 20 73 61 76 65 64 42 75  ;.  .    savedBu
1b5a0 73 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 42 75  sy = pPager->pBu
1b5b0 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70  syHandler;.    p
1b5c0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1b5d0 6c 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ler = 0;.    rc 
1b5e0 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  = pager_recycle(
1b5f0 70 50 61 67 65 72 2c 20 26 70 52 65 63 79 63 6c  pPager, &pRecycl
1b600 65 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ed);.    pPager-
1b610 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
1b620 73 61 76 65 64 42 75 73 79 3b 0a 20 20 20 20 61  savedBusy;.    a
1b630 73 73 65 72 74 28 70 52 65 63 79 63 6c 65 64 3d  ssert(pRecycled=
1b640 3d 70 50 67 20 7c 7c 20 72 63 21 3d 53 51 4c 49  =pPg || rc!=SQLI
1b650 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 69 66 28 20  TE_OK);.    if( 
1b660 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b670 0a 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20  .      /* We've 
1b680 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20  found a page to 
1b690 66 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f  free. At this po
1b6a0 69 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73  int the page has
1b6b0 20 62 65 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   been .      ** 
1b6c0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1b6d0 20 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65   page hash-table
1b6e0 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  , free-list and 
1b6f0 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20  synced-list .   
1b700 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e     ** (pFirstSyn
1b710 63 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c  ced). It is stil
1b720 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67  l in the all pag
1b730 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20  es (pAll) list. 
1b740 0a 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65  .      ** Remove
1b750 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69   it from this li
1b760 73 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  st before freein
1b770 67 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  g..      **.    
1b780 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b    ** Todo: Check
1b790 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74   the Pager.pStmt
1b7a0 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75   list to make su
1b7b0 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49  re this is Ok. I
1b7c0 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  t .      ** prob
1b7d0 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a  ably is though..
1b7e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50        */.      P
1b7f0 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  gHdr *pTmp;.    
1b800 20 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b    assert( pPg );
1b810 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d  .      if( pPg==
1b820 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
1b830 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1b840 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65  >pAll = pPg->pNe
1b850 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c  xtAll;.      }el
1b860 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
1b870 20 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e 70 41   pTmp=pPager->pA
1b880 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41  ll; pTmp->pNextA
1b890 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54  ll!=pPg; pTmp=pT
1b8a0 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d  mp->pNextAll ){}
1b8b0 0a 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70  .        pTmp->p
1b8c0 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70  NextAll = pPg->p
1b8d0 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d  NextAll;.      }
1b8e0 0a 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64  .      nReleased
1b8f0 20 2b 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20   += (.          
1b900 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70  sizeof(*pPg) + p
1b910 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a  Pager->pageSize.
1b920 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
1b930 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72  of(u32) + pPager
1b940 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20  ->nExtra.       
1b950 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f     + MEMDB*sizeo
1b960 66 28 50 67 48 69 73 74 6f 72 79 29 20 0a 20 20  f(PgHistory) .  
1b970 20 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4f 54      );.      IOT
1b980 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70  RACE(("PGFREE %p
1b990 20 25 64 20 2a 5c 6e 22 2c 20 70 50 61 67 65 72   %d *\n", pPager
1b9a0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
1b9b0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
1b9c0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67  sqlite3_pager_pg
1b9d0 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  free_count);.   
1b9e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b9f0 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  pPg->pData);.   
1ba00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1ba10 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pPg);.      pPag
1ba20 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20  er->nPage--;.   
1ba30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
1ba40 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   An error occure
1ba50 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
1ba60 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1ba70 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20   file or .      
1ba80 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61  ** journal in pa
1ba90 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54  ger_recycle(). T
1baa0 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20  he error is not 
1bab0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1bac0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
1bad0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
1bae0 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20  n. Instead, set 
1baf0 74 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64  the Pager.errCod
1bb00 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20  e variable..    
1bb10 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77    ** The error w
1bb20 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
1bb30 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20  to the user (or 
1bb40 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61  users, in the ca
1bb50 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  se .      ** of 
1bb60 61 20 73 68 61 72 65 64 20 70 61 67 65 72 20 63  a shared pager c
1bb70 61 63 68 65 29 20 6f 66 20 74 68 65 20 70 61 67  ache) of the pag
1bb80 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
1bb90 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a   error occured..
1bba0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
1bbb0 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20  ssert(.         
1bbc0 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49   (rc&0xff)==SQLI
1bbd0 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20  TE_IOERR ||.    
1bbe0 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
1bbf0 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
1bc00 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55     rc==SQLITE_BU
1bc10 53 59 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  SY.      );.    
1bc20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bc30 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1bc40 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20  ESERVED );.     
1bc50 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
1bc60 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a  ger, rc);.    }.
1bc70 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20    }..  /* Clear 
1bc80 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67  the memory manag
1bc90 65 6d 65 6e 74 20 66 6c 61 67 73 20 61 6e 64 20  ement flags and 
1bca0 72 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74 65  release the mute
1bcb0 78 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61  x.  */.  for(pPa
1bcc0 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ger=sqlite3Pager
1bcd0 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70 50  List; pPager; pP
1bce0 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65  ager=pPager->pNe
1bcf0 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65 72  xt){.     pPager
1bd00 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a  ->iInUseMM = 0;.
1bd10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1bd20 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29  tex_leave(mutex)
1bd30 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ;..  /* Return t
1bd40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1bd50 65 73 20 72 65 6c 65 61 73 65 64 0a 20 20 2a 2f  es released.  */
1bd60 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61  .  return nRelea
1bd70 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  sed;.}.#endif /*
1bd80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
1bd90 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
1bda0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20   */../*.** Read 
1bdb0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
1bdc0 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1bdd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1bde0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bdf0 72 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72  readDbPage(Pager
1be00 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
1be10 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pPg, Pgno pgno)
1be20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36  {.  int rc;.  i6
1be30 34 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73 65  4 offset;.  asse
1be40 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a  rt( MEMDB==0 );.
1be50 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
1be60 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
1be70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
1be80 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
1be90 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
1bea0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1beb0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1bec0 45 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65  EAD;.  }.  offse
1bed0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
1bee0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1bef0 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
1bf00 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1bf10 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  >fd, PGHDR_TO_DA
1bf20 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
1bf30 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
1bf40 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
1bf50 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
1bf60 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
1bf70 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1bf80 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
1bf90 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
1bfa0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1bfb0 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  no));.  if( pgno
1bfc0 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ==1 ){.    memcp
1bfd0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
1bfe0 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47  eVers, &((u8*)PG
1bff0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1c000 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20  )[24],.         
1c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c030 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67       sizeof(pPag
1c040 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1c050 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  ;.  }.  CODEC1(p
1c060 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
1c070 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
1c080 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45  pgno, 3);.  PAGE
1c090 52 54 52 41 43 45 34 28 22 46 45 54 43 48 20 25  RTRACE4("FETCH %
1c0a0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
1c0b0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1c0c0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1c0d0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1c0e0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
1c0f0 73 68 28 70 50 67 29 29 3b 0a 20 20 72 65 74 75  sh(pPg));.  retu
1c100 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1c110 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1c120 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
1c130 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  in the shared lo
1c140 63 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ck required befo
1c150 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62  re.** data may b
1c160 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
1c170 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
1c180 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
1c190 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
1c1a0 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
1c1b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1c1c0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d   no-op..**.** Im
1c1d0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
1c1e0 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68  obtaining the sh
1c1f0 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65  ared lock (if re
1c200 71 75 69 72 65 64 29 2c 20 74 68 69 73 20 66 75  quired), this fu
1c210 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73  nction.** checks
1c220 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
1c230 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20  al file. If one 
1c240 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65  is found, an eme
1c250 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a  rgency rollback.
1c260 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ** is performed 
1c270 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a  immediately..*/.
1c280 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1c290 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
1c2a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1c2b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c2c0 0a 20 20 69 6e 74 20 69 73 48 6f 74 20 3d 20 30  .  int isHot = 0
1c2d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1c2e0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
1c2f0 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  ed for exclusive
1c300 20 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20   access, has no 
1c310 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
1c320 2a 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  * page reference
1c330 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65  s and is in an e
1c340 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20  rror-state, now 
1c350 69 73 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f  is the chance to
1c360 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20   clear.  ** the 
1c370 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74  error. Discard t
1c380 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1c390 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
1c3a0 6e 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a  nd treat any.  *
1c3b0 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  * open journal f
1c3c0 69 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  ile as a hot-jou
1c3d0 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rnal..  */.  if(
1c3e0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
1c3f0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
1c400 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   && pPager->nRef
1c410 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ==0 && pPager->e
1c420 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  rrCode ){.    if
1c430 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1c440 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  lOpen ){.      i
1c450 73 48 6f 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  sHot = 1;.    }.
1c460 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1c470 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
1c480 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
1c490 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1c4a0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
1c4b0 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20   is still in an 
1c4c0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20  error state, do 
1c4d0 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68 65  not proceed. The
1c4e0 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61   error .  ** sta
1c4f0 74 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  te will be clear
1c500 65 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  ed at some point
1c510 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
1c520 68 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20 20  hen all page .  
1c530 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61 72  ** references ar
1c540 65 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74 68  e dropped and th
1c550 65 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64  e cache can be d
1c560 69 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20  iscarded..  */. 
1c570 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1c580 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
1c590 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
1c5a0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
1c5b0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1c5c0 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  de;.  }..  if( p
1c5d0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1c5e0 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73  GER_UNLOCK || is
1c5f0 48 6f 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Hot ){.    sqlit
1c600 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1c610 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
1c620 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
1c630 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1c640 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ger->nRef==0 );.
1c650 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1c660 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b  r->noReadlock ){
1c670 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
1c680 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
1c690 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
1c6a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
1c6b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1c6d0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1c6e0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
1c6f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c700 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c710 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
1c720 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
1c730 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  .      /* If a j
1c740 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
1c750 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
1c760 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
1c770 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  k on the.      *
1c780 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
1c790 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
1c7a0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
1c7b0 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
1c7c0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
1c7d0 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75     if( hasHotJou
1c7e0 72 6e 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20  rnal(pPager) || 
1c7f0 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 20  isHot ){.       
1c800 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55   /* Get an EXCLU
1c810 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1c820 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1c830 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
1c840 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   is.        ** i
1c850 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
1c860 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
1c870 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
1c880 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
1c890 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55          ** EXCLU
1c8a0 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
1c8b0 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
1c8c0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
1c8d0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  n the.        **
1c8e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1c8f0 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
1c900 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
1c910 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
1c920 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62          ** datab
1c930 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
1c940 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
1c950 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
1c960 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20  rolling it .    
1c970 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20      ** back..   
1c980 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
1c990 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
1c9a0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
1c9b0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
1c9c0 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  t requested, the
1c9d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  .        ** seco
1c9e0 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20  nd process will 
1c9f0 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  get to this poin
1ca00 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
1ca10 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20  d fail to.      
1ca20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 73 20    ** obtain its 
1ca30 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
1ca40 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1ca50 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  se file..       
1ca60 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1ca70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58  pPager->state<EX
1ca80 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
1ca90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1caa0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
1cab0 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
1cac0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
1cad0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1cae0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1caf0 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
1cb00 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
1cb10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
1cb20 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
1cb30 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
1cb40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 50 61   }.          pPa
1cb50 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1cb60 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
1cb70 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
1cb80 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
1cb90 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
1cba0 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
1cbb0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
1cbc0 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65         ** we are
1cbd0 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20   unable to open 
1cbe0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1cbf0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
1cc00 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
1cc10 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
1cc20 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
1cc30 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
1cc40 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
1cc50 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
1cc60 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
1cc70 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1cc80 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
1cc90 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
1cca0 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
1ccb0 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
1ccc0 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
1ccd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
1cce0 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
1ccf0 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
1cd00 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
1cd10 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1cd20 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
1cd30 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
1cd40 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69  e access. This i
1cd50 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20  s because in .  
1cd60 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
1cd70 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
1cd80 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1cd90 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
1cda0 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  open and.       
1cdb0 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
1cdc0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
1cdd0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
1cde0 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
1cdf0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73  he.        ** Os
1ce00 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20  Truncate() call 
1ce10 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76  used in exclusiv
1ce20 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c  e-access mode al
1ce30 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  so requires.    
1ce40 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72      ** a read/wr
1ce50 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  ite file handle.
1ce60 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1ce70 20 20 20 20 69 66 28 20 21 69 73 48 6f 74 20 29      if( !isHot )
1ce80 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1ce90 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1cea0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1ceb0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1cec0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1ced0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
1cee0 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20 20 20  S_EXISTS) ){.   
1cef0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
1cf00 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
1cf10 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
1cf20 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1cf30 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
1cf40 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
1cf50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1cf60 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1cf70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1cf80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
1cf90 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
1cfa0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
1cfb0 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74  r->jfd, f, &fout
1cfc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
1cfd0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1cfe0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
1cff0 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b  jfd->pMethods );
1d000 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1d010 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
1d020 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
1d030 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d040 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1d050 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1d060 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
1d070 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
1d080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d090 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1d0a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d0b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d0c0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
1d0d0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1d0e0 20 20 20 20 73 77 69 74 63 68 28 20 72 63 20 29      switch( rc )
1d0f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  {.            ca
1d100 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  se SQLITE_NOMEM:
1d110 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
1d120 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  e SQLITE_IOERR_U
1d130 4e 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  NLOCK:.         
1d140 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
1d150 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 0a 20 20 20 20  OERR_NOMEM:.    
1d160 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d170 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20   rc;.           
1d180 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
1d190 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1d1a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1d1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d1c0 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
1d1d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
1d1e0 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  1;.        pPage
1d1f0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1d200 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  d = 0;.        p
1d210 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1d220 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  f = 0;.        p
1d230 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
1d240 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
1d250 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1d260 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 20 20   = 0;. .        
1d270 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
1d280 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1d290 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
1d2a0 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
1d2b0 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
1d2c0 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
1d2d0 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ead lock..      
1d2e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
1d2f0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1d300 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
1d310 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d330 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
1d340 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1d350 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
1d360 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
1d370 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1d380 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20  R_SHARED || .   
1d390 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
1d3a0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1d3b0 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
1d3c0 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  >PAGER_SHARED). 
1d3d0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1d3e0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  }..      if( pPa
1d3f0 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20  ger->pAll ){.   
1d400 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
1d410 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
1d420 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
1d430 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1d440 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ile.        ** a
1d450 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  nd there are alr
1d460 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68  eady pages in th
1d470 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20  e cache (from a 
1d480 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
1d490 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74   ** read or writ
1d4a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  e transaction). 
1d4b0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1d4c0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1d4d0 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65        ** has bee
1d4e0 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
1d4f0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1d500 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20   changed, flush 
1d510 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
1d520 61 63 68 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ache..        **
1d530 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 61 74 61  .        ** Data
1d540 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20  base changes is 
1d550 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
1d560 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
1d570 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
1d580 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
1d590 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
1d5a0 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
1d5b0 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
1d5c0 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  are.        ** a
1d5d0 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
1d5e0 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
1d5f0 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
1d600 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
1d610 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
1d620 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
1d630 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
1d640 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
1d650 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
1d660 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
1d670 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a     ** .        *
1d680 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
1d690 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
1d6a0 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
1d6b0 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
1d6c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74 65  .        ** dete
1d6d0 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
1d6e0 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
1d6f0 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
1d700 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
1d710 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
1d720 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
1d730 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68     */.        ch
1d740 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
1d750 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1d760 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20  ileVers)];.     
1d770 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
1d780 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
1d790 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
1d7a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1d7b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1d7c0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1d7d0 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  de;.        }.. 
1d7e0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1d7f0 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20  r->dbSize>0 ){. 
1d800 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
1d810 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
1d820 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
1d830 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
1d840 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1d850 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1d860 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
1d870 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
1d880 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
1d890 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1d8a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1d8c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
1d8d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1d8e0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  {.          mems
1d8f0 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
1d900 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
1d910 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ers));.        }
1d920 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65  ..        if( me
1d930 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
1d940 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
1d950 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
1d960 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
1d970 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72           pager_r
1d980 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1d990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d9a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1d9b0 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
1d9c0 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
1d9d0 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f  r->state<=PAGER_
1d9e0 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66  SHARED );.    if
1d9f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1da00 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
1da10 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
1da20 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
1da30 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RED;.    }.  }..
1da40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1da50 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
1da60 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e 20 20   PgHdr object.  
1da70 20 45 69 74 68 65 72 20 63 72 65 61 74 65 20 61   Either create a
1da80 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65 75 73   new one or reus
1da90 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  e.** an existing
1daa0 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74   one that is not
1dab0 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75 73   otherwise in us
1dac0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50  e..**.** A new P
1dad0 67 48 64 72 20 73 74 72 75 63 74 75 72 65 20 69  gHdr structure i
1dae0 73 20 63 72 65 61 74 65 64 20 69 66 20 61 6e 79  s created if any
1daf0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1db00 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a  g are.** true:.*
1db10 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65  *.**     (1)  We
1db20 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65 65 64   have not exceed
1db30 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61  ed our maximum a
1db40 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65 20 73  llocated cache s
1db50 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ize.**          
1db60 61 73 20 73 65 74 20 62 79 20 74 68 65 20 22 50  as set by the "P
1db70 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
1db80 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  " command..**.**
1db90 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20       (2)  There 
1dba0 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20 50 67  are no unused Pg
1dbb0 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76 61 69  Hdr objects avai
1dbc0 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20 74 69  lable at this ti
1dbd0 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33  me..**.**     (3
1dbe0 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  )  This is an in
1dbf0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1dc00 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20  ..**.**     (4) 
1dc10 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 50 67   There are no Pg
1dc20 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68 61 74  Hdr objects that
1dc30 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
1dc40 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  a journal.**    
1dc50 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e 63 20        file sync 
1dc60 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20 74 68  and a sync of th
1dc70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1dc80 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  s currently.**  
1dc90 20 20 20 20 20 20 20 20 70 72 6f 68 69 62 69 74          prohibit
1dca0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ed..**.** Otherw
1dcb0 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20 65 78  ise, reuse an ex
1dcc0 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20 20 49  isting PgHdr.  I
1dcd0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
1dce0 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74  euse an.** exist
1dcf0 69 6e 67 20 50 67 48 64 72 20 69 66 20 61 6c 6c  ing PgHdr if all
1dd00 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1dd10 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
1dd20 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68 61  *     (1)  We ha
1dd30 76 65 20 72 65 61 63 68 65 64 20 6f 72 20 65 78  ve reached or ex
1dd40 63 65 65 64 65 64 20 74 68 65 20 6d 61 78 69 6d  ceeded the maxim
1dd50 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a  um cache size.**
1dd60 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65            allowe
1dd70 64 20 62 79 20 22 50 52 41 47 4d 41 20 63 61 63  d by "PRAGMA cac
1dd80 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20  he_size"..**.** 
1dd90 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20 69      (2)  There i
1dda0 73 20 61 20 50 67 48 64 72 20 61 76 61 69 6c 61  s a PgHdr availa
1ddb0 62 6c 65 20 77 69 74 68 20 50 67 48 64 72 2d 3e  ble with PgHdr->
1ddc0 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20  nRef==0.**.**   
1ddd0 20 20 28 33 29 20 20 57 65 20 61 72 65 20 6e 6f    (3)  We are no
1dde0 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  t in an in-memor
1ddf0 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  y database.**.**
1de00 20 20 20 20 20 28 34 29 20 20 45 69 74 68 65 72       (4)  Either
1de10 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 76 61   there is an ava
1de20 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74 68 61  ilable PgHdr tha
1de30 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a  t does not need.
1de40 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 62  **          to b
1de50 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  e synced to disk
1de60 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20 73 79   or else disk sy
1de70 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74  ncing is current
1de80 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61  ly.**          a
1de90 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  llowed..*/.stati
1dea0 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63  c int pagerAlloc
1deb0 61 74 65 50 61 67 65 28 50 61 67 65 72 20 2a 70  atePage(Pager *p
1dec0 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70  Pager, PgHdr **p
1ded0 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
1dee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
1def0 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
1df00 6e 42 79 74 65 48 64 72 3b 0a 0a 20 20 2f 2a 20  nByteHdr;..  /* 
1df10 43 72 65 61 74 65 20 61 20 6e 65 77 20 50 67 48  Create a new PgH
1df20 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  dr if any of the
1df30 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73   four conditions
1df40 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61   defined .  ** a
1df50 62 6f 76 65 20 61 72 65 20 6d 65 74 3a 20 2a 2f  bove are met: */
1df60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
1df70 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50  Page<pPager->mxP
1df80 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  age.   || pPager
1df90 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30 20  ->lru.pFirst==0 
1dfa0 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20  .   || MEMDB.   
1dfb0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e  || (pPager->lru.
1dfc0 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
1dfd0 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  && pPager->doNot
1dfe0 53 79 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 76  Sync).  ){.    v
1dff0 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
1e000 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
1e010 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  e>=pPager->nHash
1e020 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
1e030 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c  resize_hash_tabl
1e040 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  e(pPager,.      
1e050 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68     pPager->nHash
1e060 3c 32 35 36 20 3f 20 32 35 36 20 3a 20 70 50 61  <256 ? 256 : pPa
1e070 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20  ger->nHash*2);. 
1e080 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1e090 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  >nHash==0 ){.   
1e0a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e0b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1e0c0 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
1e0d0 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ate_out;.      }
1e0e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
1e0f0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
1e100 20 20 20 6e 42 79 74 65 48 64 72 20 3d 20 73 69     nByteHdr = si
1e110 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 73 69 7a  zeof(*pPg) + siz
1e120 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65  eof(u32) + pPage
1e130 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20  r->nExtra.      
1e140 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a          + MEMDB*
1e150 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
1e160 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c  );.    pPg = sql
1e170 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
1e180 74 65 48 64 72 20 29 3b 0a 20 20 20 20 69 66 28  teHdr );.    if(
1e190 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70 44   pPg ){.      pD
1e1a0 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ata = sqlite3_ma
1e1b0 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61  lloc( pPager->pa
1e1c0 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
1e1d0 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29 7b 0a  if( pData==0 ){.
1e1e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1e1f0 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  free(pPg);.     
1e200 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
1e210 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
1e220 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
1e230 3b 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30  ;.    if( pPg==0
1e240 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1e250 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1e260 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c     goto pager_al
1e270 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20  locate_out;.    
1e280 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67  }.    memset(pPg
1e290 2c 20 30 2c 20 6e 42 79 74 65 48 64 72 29 3b 0a  , 0, nByteHdr);.
1e2a0 20 20 20 20 70 50 67 2d 3e 70 44 61 74 61 20 3d      pPg->pData =
1e2b0 20 70 44 61 74 61 3b 0a 20 20 20 20 70 50 67 2d   pData;.    pPg-
1e2c0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
1e2d0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
1e2e0 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
1e2f0 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ll;.    pPager->
1e300 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
1e310 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
1e320 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1e330 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73   Recycle an exis
1e340 74 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61  ting page with a
1e350 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e   zero ref-count.
1e360 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1e370 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
1e380 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66  r, &pPg);.    if
1e390 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
1e3a0 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  Y ){.      rc = 
1e3b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
1e3c0 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CKED;.    }.    
1e3d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e3e0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
1e3f0 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
1e400 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ut;.    }.    as
1e410 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1e420 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
1e430 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70   );.    assert(p
1e440 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67  Pg);.  }.  *ppPg
1e450 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61   = pPg;..pager_a
1e460 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72  llocate_out:.  r
1e470 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e480 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  ** Make sure we 
1e490 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  have the content
1e4a0 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66   for a page.  If
1e4b0 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a   the page was.**
1e4c0 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75   previously acqu
1e4d0 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74  ired with noCont
1e4e0 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  ent==1, then the
1e4f0 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20   content was.** 
1e500 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 64  just initialized
1e510 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65 61   to zeros instea
1e520 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20  d of being read 
1e530 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75  from disk..** Bu
1e540 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74 68  t now we need th
1e550 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66 20  e real data off 
1e560 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b  of disk.  So mak
1e570 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61 76  e sure we.** hav
1e580 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20 69  e it.  Read it i
1e590 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68  n if we do not h
1e5a0 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e 0a  ave it already..
1e5b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1e5c0 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
1e5d0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
1e5e0 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64  f( pPg->needRead
1e5f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
1e600 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2d   readDbPage(pPg-
1e610 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50  >pPager, pPg, pP
1e620 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  g->pgno);.    if
1e630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e640 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
1e650 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20  edRead = 0;.    
1e660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
1e670 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1e680 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1e690 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
1e6a0 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a  cquire a page..*
1e6b0 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b  *.** A read lock
1e6c0 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
1e6d0 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68  e is obtained wh
1e6e0 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  en the first pag
1e6f0 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a  e is acquired. .
1e700 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63  ** This read loc
1e710 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65  k is dropped whe
1e720 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
1e730 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
1e740 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e750 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61  works for any pa
1e760 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge number greate
1e770 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68  r than 0.  If th
1e780 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
1e790 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  le is smaller th
1e7a0 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
1e7b0 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61   page, then no a
1e7c0 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65  ctual disk.** re
1e7d0 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ad occurs and th
1e7e0 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
1e7f0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e  f the page is in
1e800 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20  itialized to.** 
1e810 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20  all zeros.  The 
1e820 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
1e830 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
1e840 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
1e850 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20  zed.** to zeros 
1e860 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
1e870 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
1e880 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  into memory..**.
1e890 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
1e8a0 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
1e8b0 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
1e8c0 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
1e8d0 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
1e8e0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
1e8f0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1e900 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
1e910 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
1e920 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
1e930 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
1e940 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
1e950 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
1e960 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
1e970 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
1e980 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
1e990 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
1e9a0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
1e9b0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
1e9c0 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
1e9d0 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
1e9e0 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
1e9f0 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
1ea00 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
1ea10 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
1ea20 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
1ea30 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
1ea40 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
1ea50 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
1ea60 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
1ea70 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
1ea80 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
1ea90 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
1eaa0 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
1eab0 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
1eac0 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
1ead0 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
1eae0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  les..**.** If no
1eaf0 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65  Content is false
1eb00 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
1eb10 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79  nts are actually
1eb20 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e   read from disk.
1eb30 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
1eb40 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
1eb50 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
1eb60 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
1eb70 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
1eb80 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
1eb90 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74   time, so do not
1eba0 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e   do a disk read.
1ebb0 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
1ebc0 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65  he.** page conte
1ebd0 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20  nt with zeros.  
1ebe0 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63  But mark the fac
1ebf0 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6e  t that we have n
1ec00 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63  ot read the.** c
1ec10 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e  ontent by settin
1ec20 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  g the PgHdr.need
1ec30 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65  Read flag.  Late
1ec40 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c  r on, if .** sql
1ec50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1ec60 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
1ec70 69 73 20 70 61 67 65 20 6f 72 20 69 66 20 74 68  is page or if th
1ec80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
1ec90 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77 69   called again wi
1eca0 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c  th noContent==0,
1ecb0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
1ecc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20   the content is 
1ecd0 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68  needed.** and th
1ece0 65 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f 75  e disk read shou
1ecf0 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
1ed00 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
1ed10 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69  c int pagerAcqui
1ed20 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
1ed30 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
1ed40 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
1ed50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ed60 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
1ed70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1ed80 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
1ed90 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
1eda0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
1edb0 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
1edc0 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
1edd0 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
1ede0 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
1edf0 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
1ee00 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
1ee10 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
1ee20 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
1ee30 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1ee40 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1ee50 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
1ee60 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  || pPager->nRef>
1ee70 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a  0 || pgno==1 );.
1ee80 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75  .  /* The maximu
1ee90 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
1eea0 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
1eeb0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
1eec0 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  a page.  ** numb
1eed0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
1eee0 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69  this, or zero, i
1eef0 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
1ef00 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47  /.  if( pgno>PAG
1ef10 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
1ef20 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
1ef30 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1ef40 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
1ef50 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1ef60 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
1ef70 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
1ef80 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79  have not hit any
1ef90 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73   critical errors
1efa0 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74  ..  */ .  assert
1efb0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
1efc0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20   *ppPage = 0;.. 
1efd0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1efe0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63  he first page ac
1eff0 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74  cessed, then get
1f000 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20   a SHARED lock. 
1f010 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
1f020 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53  ase file. pagerS
1f030 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61  haredLock() is a
1f040 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20   no-op if .  ** 
1f050 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  a database lock 
1f060 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e  is already held.
1f070 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
1f080 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61  erSharedLock(pPa
1f090 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
1f0a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f0b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1f0c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f0d0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
1f0e0 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20  NLOCK );..  pPg 
1f0f0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1f100 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1f110 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
1f120 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1f130 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  ed page is not i
1f140 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
1f150 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61  . */.    int nMa
1f160 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  x;.    int h;.  
1f170 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1f180 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
1f190 20 72 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f 63   rc = pagerAlloc
1f1a0 61 74 65 50 61 67 65 28 70 50 61 67 65 72 2c 20  atePage(pPager, 
1f1b0 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  &pPg);.    if( r
1f1c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f1d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f1e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d  .    }..    pPg-
1f1f0 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
1f200 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
1f210 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d   || pgno>pPager-
1f220 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20 20  >stmtSize );.   
1f230 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1f240 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  = sqlite3BitvecT
1f250 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
1f260 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20  ournal, pgno);. 
1f270 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
1f280 20 3d 20 30 3b 0a 0a 20 20 20 20 6d 61 6b 65 43   = 0;..    makeC
1f290 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70  lean(pPg);.    p
1f2a0 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 0a 20  Pg->nRef = 1;.. 
1f2b0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b     pPager->nRef+
1f2c0 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  +;.    if( pPage
1f2d0 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
1f2e0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
1f2f0 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
1f300 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
1f310 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
1f320 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71   }.    nMax = sq
1f330 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1f340 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
1f350 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1f360 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Code ){.      rc
1f370 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
1f380 64 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  de;.      sqlite
1f390 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1f3a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1f3b0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
1f3c0 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61   Populate the pa
1f3d0 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65 69  ge with data, ei
1f3e0 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67 20  ther by reading 
1f3f0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1f400 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f  e.    ** file, o
1f410 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  r by setting the
1f420 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20   entire page to 
1f430 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  zero..    */.   
1f440 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70   if( nMax<(int)p
1f450 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  gno || MEMDB || 
1f460 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70  (noContent && !p
1f470 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1f480 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  lback) ){.      
1f490 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
1f4a0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
1f4b0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1f4c0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
1f4d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f4e0 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20  _FULL;.      }. 
1f4f0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
1f500 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1f510 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
1f520 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  ize);.      pPg-
1f530 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f 43 6f  >needRead = noCo
1f540 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65 72  ntent && !pPager
1f550 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1f560 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1f570 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
1f580 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1f590 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f5a0 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1f5b0 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  e(pPager, pPg, p
1f5c0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1f5d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1f5e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1f5f0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1f600 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e          pPg->pgn
1f610 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  o = 0;.        s
1f620 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1f630 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
1f640 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f650 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  }.      pPg->nee
1f660 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  dRead = 0;.    }
1f670 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  ..    /* Link th
1f680 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
1f690 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65 20  page hash table 
1f6a0 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20  */.    h = pgno 
1f6b0 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
1f6c0 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1);.    assert(
1f6d0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20   pgno!=0 );.    
1f6e0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
1f6f0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1f700 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
1f710 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
1f720 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
1f730 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
1f740 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
1f750 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
1f760 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
1f770 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
1f780 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
1f790 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1f7a0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1f7b0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
1f7c0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
1f7d0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
1f7e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1f7f0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
1f800 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
1f810 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61   cache. */.    a
1f820 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52  ssert(pPager->nR
1f830 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29  ef>0 || pgno==1)
1f840 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
1f850 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
1f860 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65      if( !noConte
1f870 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
1f880 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
1f890 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  nt(pPg);.      i
1f8a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1f8b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f8c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
1f8d0 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  ge_ref(pPg);.  }
1f8e0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67  .  *ppPage = pPg
1f8f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1f900 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
1f910 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
1f920 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1f930 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
1f940 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
1f950 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1f960 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
1f970 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
1f980 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
1f990 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
1f9a0 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
1f9b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1f9c0 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
1f9d0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
1f9e0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
1f9f0 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
1fa00 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
1fa10 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
1fa20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45  int rc;.  pagerE
1fa30 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
1fa40 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72  rc = pagerAcquir
1fa50 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
1fa60 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
1fa70 74 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  t);.  pagerLeave
1fa80 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1fa90 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1faa0 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
1fab0 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
1fac0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
1fad0 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
1fae0 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
1faf0 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
1fb00 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1fb10 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
1fb20 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
1fb30 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
1fb40 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
1fb50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1fb60 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
1fb70 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
1fb80 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
1fb90 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
1fba0 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
1fbb0 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
1fbc0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
1fbd0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
1fbe0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
1fbf0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
1fc00 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1fc10 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
1fc20 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
1fc30 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
1fc40 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
1fc50 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
1fc60 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
1fc70 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
1fc80 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
1fc90 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
1fca0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
1fcb0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
1fcc0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
1fcd0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
1fce0 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ..  pagerEnter(p
1fcf0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
1fd00 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1fd10 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
1fd20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1fd30 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65 72  ->pAll || pPager
1fd40 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1fd50 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
1fd60 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
1fd70 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
1fd80 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
1fd90 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  {.    /* Do noth
1fda0 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ing */.  }else i
1fdb0 66 28 20 28 70 50 67 20 3d 20 70 61 67 65 72 5f  f( (pPg = pager_
1fdc0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
1fdd0 67 6e 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gno))!=0 ){.    
1fde0 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
1fdf0 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
1fe00 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
1fe10 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
1fe20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
1fe30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
1fe40 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
1fe50 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
1fe60 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
1fe70 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
1fe80 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
1fe90 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
1fea0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
1feb0 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
1fec0 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
1fed0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
1fee0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
1fef0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
1ff00 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
1ff10 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1ff20 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
1ff30 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1ff40 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
1ff50 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
1ff60 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
1ff70 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a  t for this page.
1ff80 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1ff90 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
1ffa0 70 61 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e  pagerEnter(pPg->
1ffb0 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e  pPager);.  pPg->
1ffc0 6e 52 65 66 2d 2d 3b 0a 0a 20 20 43 48 45 43 4b  nRef--;..  CHECK
1ffd0 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
1ffe0 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
1fff0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
20000 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20  to a page reach 
20010 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  0, call the.  **
20020 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20   destructor and 
20030 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20  add the page to 
20040 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
20050 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  */.  if( pPg->nR
20060 65 66 3d 3d 30 20 29 7b 0a 0a 20 20 20 20 6c 72  ef==0 ){..    lr
20070 75 4c 69 73 74 41 64 64 28 70 50 67 29 3b 0a 20  uListAdd(pPg);. 
20080 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
20090 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
200a0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73      pPager->xDes
200b0 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61  tructor(pPg, pPa
200c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
200d0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
200e0 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72  When all pages r
200f0 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  each the freelis
20100 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64  t, drop the read
20110 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a   lock from.    *
20120 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
20130 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
20140 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  pPager->nRef--;.
20150 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
20160 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20  er->nRef>=0 );. 
20170 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
20180 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67  Ref==0 && (!pPag
20190 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
201a0 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
201b0 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20  rnalOff>0) ){.  
201c0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
201d0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
201e0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
201f0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
20200 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
20210 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20220 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61   Create a journa
20230 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  l file for pPage
20240 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64  r.  There should
20250 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
20260 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43  SERVED.** or EXC
20270 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
20280 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20290 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
202a0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
202b0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
202c0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
202d0 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ng.  Return an e
202e0 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65  rror code and re
202f0 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69  lease the.** wri
20300 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68  te lock if anyth
20310 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
20320 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
20330 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
20340 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
20350 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
20360 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
20370 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  Vfs;.  int flags
20380 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
20390 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
203a0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
203b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
203c0 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a  TE);..  int rc;.
203d0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
203e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
203f0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
20400 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
20410 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20420 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
20430 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20440 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
20450 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20460 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
20470 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  =0 );.  sqlite3P
20480 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
20490 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65  ager);.  pagerLe
204a0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ave(pPager);.  p
204b0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
204c0 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
204d0 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
204e0 64 62 53 69 7a 65 29 3b 0a 20 20 70 61 67 65 72  dbSize);.  pager
204f0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
20500 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
20510 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
20520 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
20530 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  MEM;.    goto fa
20540 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
20550 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rnal;.  }..  if(
20560 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
20570 65 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  e ){.    flags |
20580 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  = (SQLITE_OPEN_D
20590 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
205a0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
205b0 55 52 4e 41 4c 29 3b 0a 20 20 7d 65 6c 73 65 7b  URNAL);.  }else{
205c0 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53  .    flags |= (S
205d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
205e0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d 0a 23 69  JOURNAL);.  }.#i
205f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
20600 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
20610 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
20620 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20  urnalOpen(.     
20630 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
20640 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
20650 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e  >jfd, flags, jrn
20660 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
20670 65 72 29 0a 20 20 29 3b 0a 23 65 6c 73 65 0a 20  er).  );.#else. 
20680 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
20690 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
206a0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
206b0 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
206c0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  0);.#endif.  ass
206d0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
206e0 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66  OK || pPager->jf
206f0 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20  d->pMethods );. 
20700 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20710 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
20720 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
20730 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
20740 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66  nalHdr = 0;.  if
20750 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20760 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
20770 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
20780 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
20790 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
207a0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
207b0 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
207c0 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
207d0 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50  ournal;.  }.  pP
207e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
207f0 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
20800 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
20810 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
20820 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
20830 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
20840 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
20850 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
20860 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
20870 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
20880 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
20890 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
208a0 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
208b0 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  l;.  }.  pPager-
208c0 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
208d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
208e0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
208f0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a  alHdr(pPager);..
20900 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
20910 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63  mtAutoopen && rc
20920 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20930 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20940 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50  agerStmtBegin(pP
20950 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
20960 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
20970 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
20980 45 4d 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  EM && rc!=SQLITE
20990 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
209a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
209b0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
209c0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
209d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
209e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
209f0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
20a00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20a10 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
20a20 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
20a30 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
20a40 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
20a50 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
20a60 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
20a70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20a80 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77  *.** Acquire a w
20a90 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
20aa0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
20ab0 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20  lock is removed 
20ac0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20  when.** the any 
20ad0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
20ae0 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20   happen:.**.**  
20af0 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
20b00 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
20b10 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
20b20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
20b30 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  Rollback() is ca
20b40 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
20b50 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
20b60 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
20b70 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
20b80 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  rUnref() is call
20b90 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
20ba0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
20bb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
20bc0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
20bd0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
20be0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
20bf0 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
20c00 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
20c10 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
20c20 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
20c30 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
20c40 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
20c50 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
20c60 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
20c70 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
20c80 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
20c90 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
20ca0 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
20cb0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
20cc0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
20cd0 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
20ce0 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
20cf0 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
20d00 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
20d10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
20d20 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
20d30 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
20d40 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
20d50 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
20d60 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
20d70 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
20d80 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
20d90 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
20da0 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
20db0 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
20dc0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
20dd0 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
20de0 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
20df0 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
20e00 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
20e10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
20e20 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
20e30 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
20e40 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
20e50 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
20e60 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67  .**.** If exFlag
20e70 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65   is true, go ahe
20e80 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58  ad and get an EX
20e90 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
20ea0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65  the file.** imme
20eb0 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20  diately instead 
20ec0 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c  of waiting until
20ed0 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68   we try to flush
20ee0 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
20ef0 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67  .** exFlag is ig
20f00 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73  nored if a trans
20f10 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
20f20 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  y active..*/.int
20f30 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
20f40 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20  in(DbPage *pPg, 
20f50 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
20f60 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
20f70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
20f80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20f90 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
20fa0 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
20fb0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
20fc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20fd0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
20fe0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
20ff0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
21000 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
21010 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
21020 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
21030 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   );.    if( MEMD
21040 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
21050 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
21060 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
21070 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
21080 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
21090 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  bSize;.    }else
210a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
210b0 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
210c0 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
210d0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
210e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
210f0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
21100 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
21110 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
21120 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
21130 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
21140 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
21150 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
21160 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
21170 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21180 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21190 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
211a0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
211b0 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  r);.        retu
211c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
211d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
211e0 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
211f0 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
21200 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
21210 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
21220 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  r));.      if( p
21230 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
21240 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
21250 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
21260 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
21270 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
21280 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
21290 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
212a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
212b0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
212c0 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
212d0 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
212e0 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
212f0 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  was in exclusive
21300 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 6c 61 73  -access mode las
21310 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20  t.    ** time a 
21320 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20  (read or write) 
21330 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
21340 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  successfully con
21350 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79  cluded.    ** by
21360 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
21370 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c  . Instead of del
21380 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eting the journa
21390 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20  l file it was . 
213a0 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20     ** kept open 
213b0 61 6e 64 20 74 72 75 6e 63 61 74 65 64 20 74 6f  and truncated to
213c0 20 30 20 62 79 74 65 73 2e 0a 20 20 20 20 2a 2f   0 bytes..    */
213d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
213e0 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a  ger->nRec==0 );.
213f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
21400 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d  er->origDbSize==
21410 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
21420 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
21430 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  nal==0 );.    sq
21440 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
21450 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
21460 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
21470 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
21480 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
21490 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
214a0 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e( pPager->dbSiz
214b0 65 20 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e  e );.    pagerEn
214c0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ter(pPager);.   
214d0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70 49   if( !pPager->pI
214e0 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  nJournal ){.    
214f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
21500 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
21510 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72        pPager->or
21520 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
21530 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
21540 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
21550 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
21560 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
21570 74 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t( !pPager->jour
21580 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65  nalOpen || pPage
21590 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20  r->journalOff>0 
215a0 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
215b0 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   );.  pagerLeave
215c0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
215d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
215e0 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74  Make a page dirt
215f0 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74  y.  Set its dirt
21600 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69  y flag and add i
21610 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a  t to the dirty.*
21620 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  * page list..*/.
21630 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
21640 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67  Dirty(PgHdr *pPg
21650 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
21660 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  rty==0 ){.    Pa
21670 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
21680 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
21690 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
216a0 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
216b0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b   pPager->pDirty;
216c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
216d0 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  >pDirty ){.     
216e0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d   pPager->pDirty-
216f0 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50  >pPrevDirty = pP
21700 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  g;.    }.    pPg
21710 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30  ->pPrevDirty = 0
21720 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  ;.    pPager->pD
21730 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  irty = pPg;.  }.
21740 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
21750 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65  page clean.  Cle
21760 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74  ar its dirty bit
21770 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66   and remove it f
21780 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  rom the.** dirty
21790 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
217a0 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43  tatic void makeC
217b0 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29  lean(PgHdr *pPg)
217c0 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
217d0 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64  ty ){.    pPg->d
217e0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
217f0 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b  ( pPg->pDirty ){
21800 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21810 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  Pg->pDirty->pPre
21820 76 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20  vDirty==pPg );. 
21830 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
21840 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
21850 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a  Pg->pPrevDirty;.
21860 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
21870 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b  g->pPrevDirty ){
21880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21890 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e  Pg->pPrevDirty->
218a0 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20  pDirty==pPg );. 
218b0 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44       pPg->pPrevD
218c0 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70  irty->pDirty = p
218d0 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
218e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
218f0 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
21900 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b  ->pDirty==pPg );
21910 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
21920 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  er->pDirty = pPg
21930 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
21940 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61    }.}.../*.** Ma
21950 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
21960 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68  s writeable.  Th
21970 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
21980 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
21990 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  al .** if it is 
219a0 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
219b0 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
219c0 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
219d0 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a  before making.**
219e0 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
219f0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
21a00 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
21a10 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
21a20 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74   the pager creat
21a30 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72  es a new.** jour
21a40 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73  nal and acquires
21a50 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
21a60 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21a70 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56  .  If the RESERV
21a80 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64  ED.** lock could
21a90 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64   not be acquired
21aa0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
21ab0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
21ac0 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  SY.  The.** call
21ad0 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  ing routine must
21ae0 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20   check for that 
21af0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64  return value and
21b00 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
21b10 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79  to.** change any
21b20 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c   page data until
21b30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
21b40 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
21b50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
21b60 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64  urnal file could
21b70 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
21b80 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b  because the disk
21b90 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65   is full,.** the
21ba0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
21bb0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55  eturns SQLITE_FU
21bc0 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69  LL and does an i
21bd0 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63  mmediate rollbac
21be0 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71  k..** All subseq
21bf0 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d  uent write attem
21c00 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20  pts also return 
21c10 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69  SQLITE_FULL unti
21c20 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20  l there.** is a 
21c30 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
21c40 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20  agerCommit() or 
21c50 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
21c60 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73  back() to.** res
21c70 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
21c80 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
21c90 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69  Hdr *pPg){.  voi
21ca0 64 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52  d *pData = PGHDR
21cb0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
21cc0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
21cd0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
21ce0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21cf0 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
21d00 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
21d10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
21d20 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65  rCode ){ .    re
21d30 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
21d40 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
21d50 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
21d60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
21d70 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
21d80 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
21d90 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
21da0 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
21db0 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
21dc0 69 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76  is page was prev
21dd0 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20  iously acquired 
21de0 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
21df0 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20  1, that means.  
21e00 2a 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61  ** we didn't rea
21e10 6c 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20  lly read in the 
21e20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
21e30 61 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68  age.  This can h
21e40 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20  appen.  ** (for 
21e50 65 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68  example) when th
21e60 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
21e70 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
21e80 65 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a  elist.  But.  **
21e90 20 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72   now we are (per
21ea0 68 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65  haps) moving the
21eb0 20 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65   page off of the
21ec0 20 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20   freelist for.  
21ed0 2a 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20  ** reuse and we 
21ee0 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73  need to know its
21ef0 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
21f00 74 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e  t so that conten
21f10 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74  t.  ** can be st
21f20 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ored in the roll
21f30 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53  back journal.  S
21f40 6f 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74  o do the read at
21f50 20 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e   this.  ** time.
21f60 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
21f70 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
21f80 50 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  Pg);.  if( rc ){
21f90 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21fa0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
21fb0 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
21fc0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
21fd0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
21fe0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
21ff0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
22000 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
22010 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
22020 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29    makeDirty(pPg)
22030 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
22040 6f 75 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49  ournal && (pageI
22050 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20  nStatement(pPg) 
22060 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  || pPager->stmtI
22070 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nUse==0) ){.    
22080 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
22090 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  he = 1;.  }else{
220a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67  ..    /* If we g
220b0 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
220c0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
220d0 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
220e0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74      ** written t
220f0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
22100 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
22110 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
22120 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  nal.    ** or bo
22130 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  th..    **.    *
22140 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f  * First check to
22150 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72   see that the tr
22160 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
22170 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20  l exists and.   
22180 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66   ** create it if
22190 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20   it does not..  
221a0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
221b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
221c0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
221d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
221e0 50 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20  PagerBegin(pPg, 
221f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
22200 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22210 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22220 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
22230 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
22240 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
22250 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
22260 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
22270 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
22280 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
22290 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
222a0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
222b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
222c0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
222d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
222e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
222f0 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61  rnalOpen || !pPa
22300 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
22310 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
22320 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
22330 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
22340 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
22350 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
22360 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
22370 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
22380 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
22390 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
223a0 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
223b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
223c0 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
223d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
223e0 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
223f0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
22400 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
22410 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
22420 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  & (pPager->useJo
22430 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20  urnal || MEMDB) 
22440 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e  ){.      if( (in
22450 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
22460 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
22470 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
22480 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
22490 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
224a0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
224b0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
224c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  );.          PAG
224d0 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41  ERTRACE3("JOURNA
224e0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
224f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
22500 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
22510 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22520 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20  pHist->pOrig==0 
22530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
22540 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69  st->pOrig = sqli
22550 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67  te3_malloc( pPag
22560 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
22570 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
22580 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
22590 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
225a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
225b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
225c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
225d0 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52  st->pOrig, PGHDR
225e0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
225f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
22600 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
22610 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63  .          u32 c
22620 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  ksum;.          
22630 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
22640 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73           /* We s
22650 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
22660 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
22670 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
22680 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
22690 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
226a0 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
226b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
226c0 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
226d0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
226e0 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
226f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
22700 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
22710 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
22720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61  );.          pDa
22730 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
22740 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
22750 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
22760 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
22770 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
22780 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
22790 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
227a0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
227b0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
227c0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e  ournalOff, pPg->
227d0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
227e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
227f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
22800 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
22810 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
22820 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
22830 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
22840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
22860 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
22870 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  + 4);.          
22880 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
22890 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
228a0 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20  pageSize+4;.    
228b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
228c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
228d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
228e0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
228f0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
22900 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22910 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  Off, cksum);.   
22920 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
22930 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34  >journalOff += 4
22940 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22950 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
22960 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
22970 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
22980 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
229b0 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
229c0 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
229d0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
229e0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
229f0 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  j_count);.      
22a00 20 20 20 20 50 41 47 45 52 54 52 41 43 45 35 28      PAGERTRACE5(
22a10 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
22a20 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
22a30 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
22a50 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
22a60 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
22a70 65 65 64 53 79 6e 63 2c 20 70 61 67 65 72 5f 70  eedSync, pager_p
22a80 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 0a  agehash(pPg));..
22a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
22aa0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
22ab0 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  d writing to the
22ac0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
22ad0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  he .          **
22ae0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
22af0 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
22b00 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
22b10 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ove..          *
22b20 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
22b30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
22b50 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
22b60 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70    }..          p
22b70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
22b80 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
22b90 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
22ba0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
22bb0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
22bc0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
22bd0 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
22be0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  no);.          p
22bf0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
22c00 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
22c10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
22c20 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
22c30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
22c40 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
22c50 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c  pPager->pInStmt,
22c60 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
22c70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22c80 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
22c90 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
22ca0 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
22cb0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
22cc0 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
22cd0 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  nc;.        PAGE
22ce0 52 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20  RTRACE4("APPEND 
22cf0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
22d00 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
22d10 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
22d20 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
22d30 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
22d40 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Sync);.      }. 
22d50 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65       if( pPg->ne
22d60 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
22d70 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
22d80 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
22d90 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
22da0 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rnal = 1;.    }.
22db0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
22dc0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
22dd0 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
22de0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
22df0 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
22e00 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
22e10 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
22e20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
22e30 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
22e40 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
22e50 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
22e60 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
22e70 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
22e80 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
22e90 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
22ea0 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
22eb0 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
22ec0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
22ed0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
22ee0 65 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65  e .     && !page
22ef0 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29  InStatement(pPg)
22f00 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74 29 70   .     && (int)p
22f10 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
22f20 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20  ->stmtSize .    
22f30 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
22f40 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
22f50 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
22f60 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
22f70 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Size );.      if
22f80 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
22f90 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
22fa0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
22fb0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
22fc0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
22fd0 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d  ( pHist->pStmt==
22fe0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  0 );.        pHi
22ff0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69  st->pStmt = sqli
23000 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67  te3_malloc( pPag
23010 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
23020 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
23030 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
23040 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
23050 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52  st->pStmt, PGHDR
23060 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
23070 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
23080 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23090 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
230a0 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
230b0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
230c0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
230d0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
230e0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
230f0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
23100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23110 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
23120 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
23130 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
23140 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 63  Size);.        c
23150 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f  har *pData2 = CO
23160 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
23170 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
23180 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
23190 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
231a0 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74  er->stfd, offset
231b0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
231c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
231d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
231e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
231f0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
23200 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >stfd, pData2, p
23210 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
23220 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
23230 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
23240 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
23250 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
23260 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
23270 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
23280 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
23290 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
232a0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
232b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
232c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
232d0 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  stmtNRec++;.    
232e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
232f0 65 72 2d 3e 70 49 6e 53 74 6d 74 21 3d 30 20 29  er->pInStmt!=0 )
23300 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
23310 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
23320 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d  r->pInStmt, pPg-
23330 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
23340 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
23350 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
23360 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
23370 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  urn..  */.  asse
23380 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
23390 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
233a0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
233b0 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
233c0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
233d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
233e0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
233f0 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
23400 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
23410 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
23420 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
23430 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
23440 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
23450 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23460 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
23470 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  on is used to ma
23480 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61  rk a data-page a
23490 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75  s writable. It u
234a0 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72  ses .** pager_wr
234b0 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20  ite() to open a 
234c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
234d0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
234e0 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20  dy open).** and 
234f0 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a  write the page *
23500 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75  pData to the jou
23510 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
23520 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
23530 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
23540 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
23550 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
23560 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
23570 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
23580 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
23590 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
235a0 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
235b0 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
235c0 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
235d0 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
235e0 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
235f0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
23600 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
23610 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
23620 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
23630 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
23640 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
23650 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23660 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
23670 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
23680 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
23690 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
236a0 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
236b0 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
236c0 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
236d0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
236e0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
236f0 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44  er);.  if( !MEMD
23700 42 20 26 26 20 6e 50 61 67 65 50 65 72 53 65 63  B && nPagePerSec
23710 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
23720 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
23730 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
23740 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
23750 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
23760 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
23770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23780 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
23790 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
237a0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
237b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
237c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
237d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
237e0 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
237f0 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
23800 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
23810 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
23820 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  = 0;..    /* Set
23830 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
23840 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
23850 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
23860 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
23870 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
23880 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
23890 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
238a0 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
238b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
238c0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
238d0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
238e0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  nc==0 );.    pPa
238f0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
23900 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   1;..    /* This
23910 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
23920 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
23930 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
23940 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
23950 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
23960 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
23970 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
23980 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
23990 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
239a0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
239b0 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
239c0 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
239d0 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
239e0 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
239f0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
23a00 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65   + 1;..    nPage
23a10 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50  Count = sqlite3P
23a20 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
23a30 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
23a40 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
23a50 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
23a60 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
23a70 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
23a80 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
23a90 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
23aa0 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
23ab0 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
23ac0 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
23ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
23ae0 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
23af0 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
23b00 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
23b10 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
23b20 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
23b30 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
23b40 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
23b50 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
23b60 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
23b70 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
23b80 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
23b90 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50   pg1+ii;.      P
23ba0 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
23bb0 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e     if( pg==pPg->
23bc0 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33  pgno || !sqlite3
23bd0 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
23be0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
23bf0 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  g) ){.        if
23c00 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  ( pg!=PAGER_MJ_P
23c10 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
23c20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
23c30 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
23c40 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65  ager, pg, &pPage
23c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
23c60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23c70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
23c80 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
23c90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
23ca0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65     if( pPage->ne
23cb0 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
23cc0 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
23cd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
23ce0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
23cf0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
23d00 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
23d10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
23d20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
23d30 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  (pPage = pager_l
23d40 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
23d50 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
23d60 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65 64   if( pPage->need
23d70 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
23d80 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
23d90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23da0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
23db0 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  If the PgHdr.nee
23dc0 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
23dd0 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65  t for any of the
23de0 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20   nPage pages .  
23df0 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
23e00 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65   pg1, then it ne
23e10 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f  eds to be set fo
23e20 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42  r all of them. B
23e30 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72  ecause.    ** wr
23e40 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20  iting to any of 
23e50 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65  these nPage page
23e60 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65  s may damage the
23e70 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20   others, the.   
23e80 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
23e90 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79   must contain sy
23ea0 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66  nc()ed copies of
23eb0 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20   all of them.   
23ec0 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f   ** before any o
23ed0 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72  f them can be wr
23ee0 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
23ef0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
23f00 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
23f10 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
23f20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
23f30 61 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b  age && needSync;
23f40 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
23f50 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70  PgHdr *pPage = p
23f60 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
23f70 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20  er, pg1+ii);.   
23f80 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29       if( pPage )
23f90 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63   pPage->needSync
23fa0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
23fb0 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
23fc0 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  r->needSync);.  
23fd0 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
23fe0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
23ff0 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  nc==1 );.    pPa
24000 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
24010 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
24020 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
24030 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  e(pDbPage);.  }.
24040 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
24050 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
24060 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
24070 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
24080 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
24090 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
240a0 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
240b0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
240c0 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
240d0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
240e0 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
240f0 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
24100 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
24110 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
24120 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
24130 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
24140 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
24150 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
24160 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e  Pg->dirty;.}.#en
24170 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
24180 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a  ITE_OMIT_VACUUM.
24190 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
241a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73  e content of a s
241b0 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20  ingle page with 
241c0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
241d0 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20  in the third.** 
241e0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
241f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76 65   sqlite3PagerOve
24200 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  rwrite(Pager *pP
24210 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
24220 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20   void *pData){. 
24230 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
24240 6e 74 20 72 63 3b 0a 0a 20 20 70 61 67 65 72 45  nt rc;..  pagerE
24250 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
24260 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24270 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  rGet(pPager, pgn
24280 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20  o, &pPg);.  if( 
24290 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
242a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
242b0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29  3PagerWrite(pPg)
242c0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
242d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
242e0 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65 33 50   memcpy(sqlite3P
242f0 61 67 65 72 47 65 74 44 61 74 61 28 70 50 67 29  agerGetData(pPg)
24300 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
24310 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
24320 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
24330 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
24340 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
24350 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
24360 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
24370 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
24380 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
24390 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
243a0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
243b0 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
243c0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
243d0 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
243e0 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
243f0 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
24400 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
24410 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
24420 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
24430 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
24440 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
24450 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
24460 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
24470 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
24480 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
24490 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
244a0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
244b0 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
244c0 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
244d0 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
244e0 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
244f0 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
24500 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
24510 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
24520 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
24530 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
24540 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
24550 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
24560 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
24570 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
24580 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
24590 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
245a0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
245b0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
245c0 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73  , set the always
245d0 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f  Rollback flag to
245e0 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71   true..** Subseq
245f0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
24600 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
24610 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65  llback() for the
24620 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69   same page.** wi
24630 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65  ll thereafter be
24640 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
24650 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
24660 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a  avoid a problem.
24670 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20  ** where a page 
24680 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64  with data is add
24690 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
246a0 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61  st during one pa
246b0 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73  rt of.** a trans
246c0 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f  action then remo
246d0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ved from the fre
246e0 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c  elist during a l
246f0 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ater part.** of 
24700 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
24710 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
24720 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
24730 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74  urpose.  When it
24740 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64  .** is first add
24750 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
24760 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
24770 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65   is called.  Whe
24780 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65  n reused,.** the
24790 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
247a0 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74  tRollback() rout
247b0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
247c0 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 0a  But because the.
247d0 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ** page contains
247e0 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20   critical data, 
247f0 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
24800 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73   be sure it gets
24810 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
24820 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65 20  in spite of the 
24830 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
24840 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  Rollback() call.
24850 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24860 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44  PagerDontWrite(D
24870 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
24880 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
24890 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
248a0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
248b0 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d  pPager;..  if( M
248c0 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  EMDB ) return;. 
248d0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
248e0 65 72 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61  er);.  pPg->alwa
248f0 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
24900 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
24910 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d   && !pPager->stm
24920 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73  tInUse ){.    as
24930 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
24940 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
24950 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
24960 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e  ger->dbSize==(in
24970 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70  t)pPg->pgno && p
24980 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
24990 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
249a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
249b0 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68  this pages is th
249c0 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74  e last page in t
249d0 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  he file and the 
249e0 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20  file has grown. 
249f0 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74       ** during t
24a00 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
24a10 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20  action, then do 
24a20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67  NOT mark the pag
24a30 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20  e as clean..    
24a40 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61    ** When the da
24a50 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77  tabase file grow
24a60 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20  s, we must make 
24a70 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61  sure that the la
24a80 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  st page.      **
24a90 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74   gets written at
24aa0 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74   least once so t
24ab0 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c  hat the disk fil
24ac0 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  e will be the co
24ad0 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73  rrect.      ** s
24ae0 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e  ize. If you do n
24af0 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61  ot write this pa
24b00 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ge and the size 
24b10 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  of the file.    
24b20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b    ** on the disk
24b30 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74   ends up being t
24b40 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63  oo small, that c
24b50 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
24b60 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  ase.      ** cor
24b70 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74  ruption during t
24b80 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74  he next transact
24b90 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
24ba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
24bb0 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54  AGERTRACE3("DONT
24bc0 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
24bd0 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
24be0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
24bf0 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  er));.      IOTR
24c00 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25  ACE(("CLEAN %p %
24c10 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
24c20 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20  g->pgno)).      
24c30 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
24c40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
24c50 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
24c60 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
24c70 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
24c80 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
24c90 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  }.  }.  pagerLea
24ca0 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ve(pPager);.}../
24cb0 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
24cc0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
24cd0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
24ce0 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
24cf0 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
24d00 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
24d10 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
24d20 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
24d30 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
24d40 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
24d50 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
24d60 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
24d70 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
24d80 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
24d90 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  rnal..**.** If w
24da0 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61  e have not yet a
24db0 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65  ctually read the
24dc0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
24dd0 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65   page (if.** the
24de0 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
24df0 66 6c 61 67 20 69 73 20 73 65 74 29 20 74 68 65  flag is set) the
24e00 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
24e10 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65  cts as a promise
24e20 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c  .** that we will
24e30 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72   never need to r
24e40 65 61 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ead the page con
24e50 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  tent in the futu
24e60 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65  re..** so the ne
24e70 65 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20  edRead flag can 
24e80 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 74 68  be cleared at th
24e90 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  is point..**.** 
24ea0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
24eb0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d  only called from
24ec0 20 61 20 73 69 6e 67 6c 65 20 70 6c 61 63 65 20   a single place 
24ed0 69 6e 20 74 68 65 20 73 71 6c 69 74 65 20 62 74  in the sqlite bt
24ee0 72 65 65 0a 2a 2a 20 63 6f 64 65 20 28 77 68 65  ree.** code (whe
24ef0 6e 20 61 20 6c 65 61 66 20 69 73 20 72 65 6d 6f  n a leaf is remo
24f00 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ved from the fre
24f10 65 2d 6c 69 73 74 29 2e 20 54 68 69 73 20 61 6c  e-list). This al
24f20 6c 6f 77 73 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  lows the.** foll
24f30 6f 77 69 6e 67 20 61 73 73 75 6d 70 74 69 6f 6e  owing assumption
24f40 73 20 74 6f 20 62 65 20 6d 61 64 65 20 61 62 6f  s to be made abo
24f50 75 74 20 70 50 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  ut pPg:.**.**   
24f60 31 2e 20 50 61 67 65 72 44 6f 6e 74 57 72 69 74  1. PagerDontWrit
24f70 65 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  e() has been cal
24f80 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  led on the page,
24f90 20 4f 52 20 0a 2a 2a 20 20 20 20 20 20 50 61 67   OR .**      Pag
24fa0 65 72 57 72 69 74 65 28 29 20 68 61 73 20 6e 6f  erWrite() has no
24fb0 74 20 79 65 74 20 62 65 65 6e 20 63 61 6c 6c 65  t yet been calle
24fc0 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  d on the page..*
24fd0 2a 0a 2a 2a 20 20 20 32 2e 20 54 68 65 20 70 61  *.**   2. The pa
24fe0 67 65 20 65 78 69 73 74 65 64 20 77 68 65 6e 20  ge existed when 
24ff0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
25000 77 61 73 20 73 74 61 72 74 65 64 2e 0a 2a 2a 0a  was started..**.
25010 2a 2a 20 44 65 74 61 69 6c 73 3a 20 44 6f 6e 74  ** Details: Dont
25020 52 6f 6c 6c 62 61 63 6b 28 29 20 28 74 68 69 73  Rollback() (this
25030 20 72 6f 75 74 69 6e 65 29 20 69 73 20 6f 6e 6c   routine) is onl
25040 79 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  y called when a 
25050 6c 65 61 66 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  leaf is.** remov
25060 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
25070 20 6c 69 73 74 2e 20 44 6f 6e 74 57 72 69 74 65   list. DontWrite
25080 28 29 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  () is called whe
25090 6e 65 76 65 72 20 61 20 70 61 67 65 20 0a 2a 2a  never a page .**
250a0 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d   becomes a free-
250b0 6c 69 73 74 20 6c 65 61 66 2e 0a 2a 2f 0a 76 6f  list leaf..*/.vo
250c0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  id sqlite3PagerD
250d0 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61  ontRollback(DbPa
250e0 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
250f0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
25100 3e 70 50 61 67 65 72 3b 0a 0a 20 20 70 61 67 65  >pPager;..  page
25110 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
25120 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25130 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
25140 45 53 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a  ESERVED );..  /*
25150 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
25160 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
25170 2c 20 6f 72 20 44 6f 6e 74 57 72 69 74 65 28 29  , or DontWrite()
25180 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
25190 20 6f 6e 0a 20 20 2a 2a 20 74 68 69 73 20 70 61   on.  ** this pa
251a0 67 65 20 28 44 6f 6e 74 57 72 69 74 65 28 29 20  ge (DontWrite() 
251b0 73 65 74 73 20 74 68 65 20 61 6c 77 61 79 73 52  sets the alwaysR
251c0 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 29 2c 20 74  ollback flag), t
251d0 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  hen this.  ** fu
251e0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
251f0 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  p..  */.  if( pP
25200 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
25210 6e 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 61 6c 77  n==0 || pPg->alw
25220 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70  aysRollback || p
25230 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
25240 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70 61 67  lback ){.    pag
25250 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
25260 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
25270 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
25280 42 20 29 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61  B );    /* For a
25290 20 6d 65 6d 64 62 2c 20 70 50 61 67 65 72 2d 3e   memdb, pPager->
252a0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 69 73 20 61  journalOpen is a
252b0 6c 77 61 79 73 20 30 20 2a 2f 0a 0a 20 20 2f 2a  lways 0 */..  /*
252c0 20 43 68 65 63 6b 20 74 68 61 74 20 50 61 67 65   Check that Page
252d0 72 57 72 69 74 65 28 29 20 68 61 73 20 6e 6f 74  rWrite() has not
252e0 20 79 65 74 20 62 65 65 6e 20 63 61 6c 6c 65 64   yet been called
252f0 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 61   on this page, a
25300 6e 64 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  nd.  ** that the
25310 20 70 61 67 65 20 65 78 69 73 74 65 64 20 77 68   page existed wh
25320 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
25330 6f 6e 20 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f  on started..  */
25340 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
25350 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  >inJournal && (i
25360 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
25370 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
25380 7a 65 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ze );..  assert(
25390 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
253a0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal!=0 );.  sqli
253b0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
253c0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
253d0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70   pPg->pgno);.  p
253e0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
253f0 31 3b 0a 20 20 70 50 67 2d 3e 6e 65 65 64 52 65  1;.  pPg->needRe
25400 61 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ad = 0;.  if( pP
25410 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
25420 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
25430 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
25440 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
25450 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 71 6c  bSize );.    sql
25460 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
25470 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70  ager->pInStmt, p
25480 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  Pg->pgno);.  }. 
25490 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f   PAGERTRACE3("DO
254a0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65  NT_ROLLBACK page
254b0 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
254c0 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
254d0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54  (pPager));.  IOT
254e0 52 41 43 45 28 28 22 47 41 52 42 41 47 45 20 25  RACE(("GARBAGE %
254f0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
25500 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 70   pPg->pgno)).  p
25510 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
25520 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
25530 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
25540 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
25550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25560 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
25570 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
25580 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
25590 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
255a0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
255b0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
255c0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
255d0 20 69 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a   int isDirect){.
255e0 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
255f0 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
25600 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  unter;.  int rc 
25610 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
25620 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61  if( !pPager->cha
25630 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a  ngeCountDone ){.
25640 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
25650 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
25660 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
25670 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
25680 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
25690 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  1, &pPgHdr);.   
256a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
256b0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
256c0 0a 20 20 20 20 69 66 28 20 21 69 73 44 69 72 65  .    if( !isDire
256d0 63 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ct ){.      rc =
256e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
256f0 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
25700 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25710 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
25720 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
25730 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20  (pPgHdr);.      
25740 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
25750 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
25760 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
25770 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
25780 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
25790 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
257a0 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75  /.    change_cou
257b0 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
257c0 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67  t4byte((u8*)pPag
257d0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b  er->dbFileVers);
257e0 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  .    change_coun
257f0 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32  ter++;.    put32
25800 62 69 74 73 28 28 28 63 68 61 72 2a 29 50 47 48  bits(((char*)PGH
25810 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64  DR_TO_DATA(pPgHd
25820 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  r))+24, change_c
25830 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 69 66  ounter);..    if
25840 28 20 69 73 44 69 72 65 63 74 20 26 26 20 70 50  ( isDirect && pP
25850 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
25860 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ds ){.      cons
25870 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 50  t void *zBuf = P
25880 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
25890 48 64 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Hdr);.      rc =
258a0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
258b0 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
258c0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
258d0 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  ze, 0);.    }.. 
258e0 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
258f0 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
25900 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
25910 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
25920 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
25930 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
25940 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
25950 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
25960 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
25970 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61   file for the pa
25980 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73  ger pPager. zMas
25990 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
259a0 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d  e name.** of a m
259b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
259c0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
259d0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
259e0 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a  he individual.**
259f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a   journal file. z
25a00 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55  Master may be NU
25a10 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74  LL, which is int
25a20 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d  erpreted as no m
25a30 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
25a40 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62   (a single datab
25a50 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
25a60 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
25a70 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
25a80 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
25a90 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72   synced, all dir
25aa0 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ty pages written
25ab0 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
25ac0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
25ad0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
25ae0 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20  ynced. The only 
25af0 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65  thing that.** re
25b00 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
25b10 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
25b20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
25b30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
25b40 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  r.** master jour
25b50 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63  nal file if spec
25b60 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ified)..**.** No
25b70 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74  te that if zMast
25b80 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64  er==NULL, this d
25b90 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74  oes not overwrit
25ba0 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c  e a previous val
25bb0 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  ue.** passed to 
25bc0 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  an sqlite3PagerC
25bd0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
25be0 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  call..**.** If p
25bf0 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20  arameter nTrunc 
25c00 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
25c10 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
25c20 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
25c30 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73  .** nTrunc pages
25c40 20 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62   (this is used b
25c50 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
25c60 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74  tabases)..*/.int
25c70 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
25c80 6d 69 74 50 68 61 73 65 4f 6e 65 28 50 61 67 65  mitPhaseOne(Page
25c90 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
25ca0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
25cb0 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20  Pgno nTrunc){.  
25cc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25cd0 4f 4b 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  OK;..  PAGERTRAC
25ce0 45 34 28 22 44 41 54 41 42 41 53 45 20 53 59 4e  E4("DATABASE SYN
25cf0 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74  C: File=%s zMast
25d00 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c  er=%s nTrunc=%d\
25d10 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  n", .      pPage
25d20 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d  r->zFilename, zM
25d30 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  aster, nTrunc);.
25d40 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
25d50 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ger);..  /* If t
25d60 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
25d70 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
25d80 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
25d90 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
25da0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
25db0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
25dc0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
25dd0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
25de0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
25df0 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26  !=PAGER_SYNCED &
25e00 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  & !MEMDB && pPag
25e10 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
25e20 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
25e30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
25e40 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
25e50 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68 65 20  RITE.    /* The 
25e60 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
25e70 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
25e80 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f 66 20   used if all of 
25e90 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  the.    ** follo
25ea0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
25eb0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
25ec0 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65  + The file-syste
25ed0 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61  m supports the a
25ee0 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70  tomic-write prop
25ef0 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erty for.    ** 
25f00 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73       blocks of s
25f10 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61  ize page-size, a
25f20 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  nd.    **    + T
25f30 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f  his commit is no
25f40 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
25f50 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
25f60 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  on, and.    **  
25f70 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e 65 20    + Exactly one 
25f80 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  page has been mo
25f90 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65  dified and store
25fa0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
25fb0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
25fc0 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d   ** If the optim
25fd0 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
25fe0 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  sed, then the jo
25ff0 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
26000 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62 65 20  never.    ** be 
26010 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73  created for this
26020 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
26030 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 65    */.    int use
26040 41 74 6f 6d 69 63 57 72 69 74 65 20 3d 20 28 0a  AtomicWrite = (.
26050 20 20 20 20 20 20 20 20 21 7a 4d 61 73 74 65 72          !zMaster
26060 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
26070 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
26080 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28  =jrnlBufferSize(
26090 70 50 61 67 65 72 29 20 26 26 20 0a 20 20 20 20  pPager) && .    
260a0 20 20 20 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26      nTrunc==0 &&
260b0 20 0a 20 20 20 20 20 20 20 20 28 30 3d 3d 70 50   .        (0==pP
260c0 61 67 65 72 2d 3e 70 44 69 72 74 79 20 7c 7c 20  ager->pDirty || 
260d0 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74  0==pPager->pDirt
260e0 79 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20 29  y->pDirty).    )
260f0 3b 0a 20 20 20 20 69 66 28 20 75 73 65 41 74 6f  ;.    if( useAto
26100 6d 69 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20  micWrite ){.    
26110 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
26120 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
26130 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
26140 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66  */.      int off
26150 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
26160 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
26170 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
26180 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
26190 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b  Pager->nRec==1);
261a0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
261b0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
261c0 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61  jfd, offset, pPa
261d0 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
261e0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
261f0 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20   db file change 
26200 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c  counter. The fol
26210 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c  lowing call will
26220 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a   modify.      **
26230 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
26240 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
26250 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75   page 1 to inclu
26260 64 65 20 74 68 65 20 75 70 64 61 74 65 64 0a 20  de the updated. 
26270 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63       ** change c
26280 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
26290 77 72 69 74 65 20 70 61 67 65 20 31 20 64 69 72  write page 1 dir
262a0 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74  ectly to the dat
262b0 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
262c0 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20  ile. Because of 
262d0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
262e0 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
262f0 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65   host file-syste
26300 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  m, .      ** thi
26310 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20  s is safe..     
26320 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
26330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26340 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
26350 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
26360 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
26370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
26380 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
26390 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
263a0 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
263b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
263c0 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65   !useAtomicWrite
263d0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
263e0 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  K ).#endif..    
263f0 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  /* If a master j
26400 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
26410 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
26420 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
26430 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
26440 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79  file, then no sy
26450 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
26460 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
26470 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77  n it is.    ** w
26480 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65  ritten, then the
26490 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74   process fails t
264a0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
264b0 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a   RESERVED to an.
264c0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
264d0 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20   lock. The next 
264e0 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73  time the process
264f0 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74   tries to commit
26500 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
26510 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20  saction the m-j 
26520 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61  name will have a
26530 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
26540 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
26550 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  if( !pPager->set
26560 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
26570 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26580 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
26590 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
265a0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
265b0 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
265c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
265d0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
265e0 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66  nc_exit;.#ifndef
265f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26600 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
26610 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
26620 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
26630 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
26640 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
26650 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
26660 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
26670 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
26680 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
26690 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
266a0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
266b0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
266c0 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  ** file..       
266d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
266e0 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   i;.        int 
266f0 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a  iSkip = PAGER_MJ
26700 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20  _PGNO(pPager);. 
26710 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54         for( i=nT
26720 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65  runc+1; i<=pPage
26730 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69  r->origDbSize; i
26740 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ++ ){.          
26750 69 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76  if( !sqlite3Bitv
26760 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
26770 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26  InJournal, i) &&
26780 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20   i!=iSkip ){.   
26790 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
267a0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
267b0 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a  ager, i, &pPg);.
267c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
267d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
267e0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
267f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
26800 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
26810 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  te(pPg);.       
26820 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
26830 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
26840 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
26850 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
26860 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
26870 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26880 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   } .      }.#end
26890 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  if.      rc = wr
268a0 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
268b0 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
268c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
268d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
268e0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
268f0 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
26900 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
26910 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
26920 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
26930 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 23 69 66 6e  sync_exit;..#ifn
26940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26950 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
26960 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  f( nTrunc!=0 ){.
26970 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26980 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
26990 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b  pPager, nTrunc);
269a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
269b0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
269c0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
269d0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
269e0 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
269f0 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
26a00 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
26a10 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
26a20 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
26a30 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  s(pPager);.    r
26a40 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
26a50 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20  pagelist(pPg);. 
26a60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26a70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
26a80 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
26a90 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
26aa0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  ;.      /* The e
26ab0 72 72 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20  rror might have 
26ac0 6c 65 66 74 20 74 68 65 20 64 69 72 74 79 20 6c  left the dirty l
26ad0 69 73 74 20 61 6c 6c 20 66 6f 75 6c 65 64 20 75  ist all fouled u
26ae0 70 20 68 65 72 65 2c 0a 20 20 20 20 20 20 2a 2a  p here,.      **
26af0 20 62 75 74 20 74 68 61 74 20 64 6f 65 73 20 6e   but that does n
26b00 6f 74 20 6d 61 74 74 65 72 20 62 65 63 61 75 73  ot matter becaus
26b10 65 20 69 66 20 74 68 65 20 69 66 20 74 68 65 20  e if the if the 
26b20 64 69 72 74 79 20 6c 69 73 74 20 64 69 64 0a 20  dirty list did. 
26b30 20 20 20 20 20 2a 2a 20 67 65 74 20 63 6f 72 72       ** get corr
26b40 75 70 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  upted, then the 
26b50 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
26b60 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6e 64 0a 20   roll back and. 
26b70 20 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 20       ** discard 
26b80 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 2e 20  the dirty list. 
26b90 20 54 68 65 72 65 20 69 73 20 61 6e 20 61 73 73   There is an ass
26ba0 65 72 74 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ert in.      ** 
26bb0 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
26bc0 72 74 79 5f 70 61 67 65 73 28 29 20 74 68 61 74  rty_pages() that
26bd0 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 6e   verifies that n
26be0 6f 20 61 74 74 65 6d 70 74 0a 20 20 20 20 20 20  o attempt.      
26bf0 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 75 73  ** is made to us
26c00 65 20 61 6e 20 69 6e 76 61 6c 69 64 20 64 69 72  e an invalid dir
26c10 74 79 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ty list..      *
26c20 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 79 6e  /.      goto syn
26c30 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  c_exit;.    }.  
26c40 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
26c50 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79   = 0;..    /* Sy
26c60 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
26c70 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
26c80 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
26c90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
26ca0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
26cb0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
26cc0 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
26cd0 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
26ce0 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20  ("DBSYNC %p\n", 
26cf0 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50  pPager))..    pP
26d00 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
26d10 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65  GER_SYNCED;.  }e
26d20 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26  lse if( MEMDB &&
26d30 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
26d40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26d50 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67  gerTruncate(pPag
26d60 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d  er, nTrunc);.  }
26d70 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69  ..sync_exit:.  i
26d80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
26d90 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20  ERR_BLOCKED ){. 
26da0 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72     /* pager_incr
26db0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
26dc0 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
26dd0 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73  obtain an exclus
26de0 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20  ive.     * lock 
26df0 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63  to spill the cac
26e00 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f  he and return IO
26e10 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74  ERR_BLOCKED. But
26e20 20 73 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74   since .     * t
26e30 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
26e40 65 20 74 68 65 20 63 61 63 68 65 20 69 73 20 69  e the cache is i
26e50 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20  nconsistent, it 
26e60 69 73 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72  is.     * better
26e70 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
26e80 45 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a  E_BUSY..     */.
26e90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26ea0 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 61 67 65  BUSY;.  }.  page
26eb0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
26ec0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26ed0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c  ./*.** Commit al
26ee0 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  l changes to the
26ef0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
26f00 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
26f10 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
26f20 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20  he commit fails 
26f30 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
26f40 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d  a rollback attem
26f50 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e  pt is made.** an
26f60 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
26f70 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
26f80 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b   the commit work
26f90 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  ed, SQLITE_OK.**
26fa0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
26fb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
26fc0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
26fd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
26fe0 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
26ff0 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70  r *pPg;..  if( p
27000 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
27010 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
27020 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
27030 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
27040 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
27050 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
27060 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
27070 0a 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65  .  }.  pagerEnte
27080 72 28 70 50 61 67 65 72 29 3b 0a 20 20 50 41 47  r(pPager);.  PAG
27090 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54  ERTRACE2("COMMIT
270a0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
270b0 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
270c0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67  MEMDB ){.    pPg
270d0 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
270e0 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
270f0 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ger);.    while(
27100 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 50 67   pPg ){.      Pg
27110 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
27120 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
27130 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
27140 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
27150 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  pHist);.      pP
27160 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
27170 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
27180 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48  al = 0;.      pH
27190 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  ist->inStmt = 0;
271a0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
271b0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sync = 0;.      
271c0 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
271d0 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
271e0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
271f0 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  Pg = pPg->pDirty
27200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
27210 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
27220 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
27230 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
27240 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
27250 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
27260 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
27270 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
27280 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
27290 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
272a0 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79  ert( !pPg->alway
272b0 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
272c0 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
272d0 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  t->pOrig );.    
272e0 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
272f0 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d  ->pStmt );.    }
27300 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67  .#endif.    pPag
27310 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
27320 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
27330 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
27340 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
27350 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
27360 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27370 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
27380 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
27390 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72   || !pPager->dir
273a0 74 79 43 61 63 68 65 20 29 3b 0a 20 20 61 73 73  tyCache );.  ass
273b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
273c0 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
273d0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72   || !pPager->dir
273e0 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20  tyCache );.  rc 
273f0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
27400 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
27410 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72  .  rc = pager_er
27420 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
27430 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
27440 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
27450 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
27460 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
27470 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  s.  The database
27480 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50   falls back to P
27490 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65  AGER_SHARED mode
274a0 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
274b0 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
274c0 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
274d0 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
274e0 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
274f0 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
27500 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
27510 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
27520 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
27530 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
27540 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
27550 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
27560 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75  ng protocol or u
27570 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
27580 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77  .** process is w
27590 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74  riting trash int
275a0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
275b0 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  le (SQLITE_CORRU
275c0 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73  PT) or.** unless
275d0 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28   a prior malloc(
275e0 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45  ) failed (SQLITE
275f0 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70  _NOMEM).  Approp
27600 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  riate error.** c
27610 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
27620 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20  d for all these 
27630 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65  occasions.  Othe
27640 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45  rwise,.** SQLITE
27650 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
27660 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
27670 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
27680 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
27690 6e 74 20 72 63 3b 0a 20 20 50 41 47 45 52 54 52  nt rc;.  PAGERTR
276a0 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25  ACE2("ROLLBACK %
276b0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
276c0 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
276d0 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72  MDB ){.    PgHdr
276e0 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
276f0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20  Pager->pAll; p; 
27700 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  p=p->pNextAll){.
27710 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
27720 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73  *pHist;.      as
27730 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73  sert( !p->always
27740 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
27750 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20    if( !p->dirty 
27760 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
27770 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
27780 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
27790 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72  p, pPager))->pOr
277a0 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ig );.        as
277b0 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
277c0 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
277d0 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
277e0 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20  pStmt );.       
277f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
27800 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20   }..      pHist 
27810 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
27820 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  p, pPager);.    
27830 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72    if( pHist->pOr
27840 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  ig ){.        me
27850 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
27860 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f  TA(p), pHist->pO
27870 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  rig, pPager->pag
27880 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
27890 50 41 47 45 52 54 52 41 43 45 33 28 22 52 4f 4c  PAGERTRACE3("ROL
278a0 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66  LBACK-PAGE %d of
278b0 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
278c0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
278d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
278e0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
278f0 43 45 33 28 22 50 41 47 45 20 25 64 20 69 73 20  CE3("PAGE %d is 
27900 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20  clean on %d\n", 
27910 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  p->pgno, PAGERID
27920 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
27930 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69   }.      clearHi
27940 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20  story(pHist);.  
27950 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30      p->dirty = 0
27960 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75  ;.      p->inJou
27970 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
27980 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
27990 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e  0;.      pHist->
279a0 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73  pPrevStmt = pHis
279b0 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  t->pNextStmt = 0
279c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
279d0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
279e0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
279f0 3e 78 52 65 69 6e 69 74 65 72 28 70 2c 20 70 50  >xReiniter(p, pP
27a00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
27a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27a20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
27a30 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
27a40 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
27a50 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
27a60 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44   = pPager->origD
27a70 62 53 69 7a 65 3b 0a 20 20 20 20 70 61 67 65 72  bSize;.    pager
27a80 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
27a90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
27aa0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
27ab0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
27ac0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
27ad0 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
27ae0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
27af0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
27b00 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 70 50  ager);.  if( !pP
27b10 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
27b20 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75   || !pPager->jou
27b30 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
27b40 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
27b50 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
27b60 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61  r);.    pagerLea
27b70 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
27b80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
27b90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
27ba0 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
27bb0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
27bc0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
27bd0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
27be0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
27bf0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
27c00 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
27c10 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  0);.    }.    pa
27c20 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
27c30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  ;.    return pPa
27c40 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
27c50 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
27c60 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
27c70 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74  ERVED ){.    int
27c80 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70   rc2;.    rc = p
27c90 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
27ca0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63  ager, 0);.    rc
27cb0 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  2 = pager_end_tr
27cc0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
27cd0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
27ce0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27cf0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
27d00 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
27d10 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
27d20 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
27d30 20 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f 72 65   }.  /* pager_re
27d40 73 65 74 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a  set(pPager); */.
27d50 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
27d60 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20   = -1;..  /* If 
27d70 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
27d80 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43  during a ROLLBAC
27d90 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e  K, we can no lon
27da0 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61  ger trust the pa
27db0 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20  ger.  ** cache. 
27dc0 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72  So call pager_er
27dd0 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79  ror() on the way
27de0 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79   out to make any
27df0 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72   error .  ** per
27e00 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  sistent..  */.  
27e10 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
27e20 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
27e30 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
27e40 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
27e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
27e60 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
27e70 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
27e80 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
27e90 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
27ea0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
27eb0 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
27ec0 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  writable..*/.int
27ed0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
27ee0 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70  eadonly(Pager *p
27ef0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
27f00 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
27f10 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
27f20 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
27f30 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
27f40 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74  he pager..*/.int
27f50 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
27f60 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
27f70 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
27f80 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a  Pager->nRef;.}..
27f90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
27fa0 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ST./*.** This ro
27fb0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
27fc0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
27fd0 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
27fe0 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65  int *sqlite3Page
27ff0 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  rStats(Pager *pP
28000 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
28010 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
28020 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ] = pPager->nRef
28030 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65  ;.  a[1] = pPage
28040 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d  r->nPage;.  a[2]
28050 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67   = pPager->mxPag
28060 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  e;.  a[3] = pPag
28070 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b  er->dbSize;.  a[
28080 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
28090 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
280a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
280b0 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
280c0 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
280d0 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
280e0 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65  [8] = 0;  /* Use
280f0 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e  d to be pPager->
28100 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20  nOvfl */.  a[9] 
28110 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b  = pPager->nRead;
28120 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65  .  a[10] = pPage
28130 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  r->nWrite;.  ret
28140 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn a;.}.#endif.
28150 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73  ./*.** Set the s
28160 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
28170 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  k point..**.** T
28180 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
28190 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ld be called wit
281a0 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
281b0 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64  n journal alread
281c0 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65  y.** open.  A ne
281d0 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  w statement jour
281e0 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74  nal is created t
281f0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
28200 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63  to rollback.** c
28210 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67  hanges of a sing
28220 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77  le SQL command w
28230 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74  ithin a larger t
28240 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
28250 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
28260 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a  tmtBegin(Pager *
28270 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
28280 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  c;.  assert( !pP
28290 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
282a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
282b0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
282c0 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73  R_SHARED );.  as
282d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
282e0 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47  Size>=0 );.  PAG
282f0 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42  ERTRACE2("STMT-B
28300 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  EGIN %d\n", PAGE
28310 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
28320 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
28330 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
28340 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  se = 1;.    pPag
28350 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
28360 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
28370 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28380 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
28390 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
283a0 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65  pen ){.    pPage
283b0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
283c0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
283d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
283e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
283f0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
28400 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
28410 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
28420 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d  pPager->pInStmt=
28430 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =0 );.  pPager->
28440 70 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  pInStmt = sqlite
28450 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
28460 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
28470 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
28480 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
28490 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29 7b  r->pInStmt==0 ){
284a0 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f  .    /* sqlite3O
284b0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
284c0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20  , SHARED_LOCK); 
284d0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
284e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
284f0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
28500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
28510 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
28520 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  jfd, &pPager->st
28530 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
28540 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
28550 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61  egin_failed;.  a
28560 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
28570 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67  tmtJSize == pPag
28580 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
28590 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
285a0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70  r->stmtJSize = p
285b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
285c0 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  f;.  pPager->stm
285d0 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
285e0 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  dbSize;.  pPager
285f0 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30  ->stmtHdrOff = 0
28600 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
28610 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  Cksum = pPager->
28620 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28  cksumInit;.  if(
28630 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70   !pPager->stmtOp
28640 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
28650 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
28660 65 6d 70 28 70 50 61 67 65 72 2d 3e 70 56 66 73  emp(pPager->pVfs
28670 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  , pPager->stfd, 
28680 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e  pPager->zStmtJrn
28690 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
286c0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 69 66  JOURNAL);.    if
286d0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f  ( rc ){.      go
286e0 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
286f0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
28700 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
28710 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
28720 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
28730 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
28740 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  mtInUse = 1;.  r
28750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28760 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  . .stmt_begin_fa
28770 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
28780 65 72 2d 3e 70 49 6e 53 74 6d 74 20 29 7b 0a 20  er->pInStmt ){. 
28790 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
287a0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
287b0 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50  pInStmt);.    pP
287c0 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20  ager->pInStmt = 
287d0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
287e0 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
287f0 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
28800 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
28810 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65    int rc;.  page
28820 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
28830 20 20 72 63 20 3d 20 70 61 67 65 72 53 74 6d 74    rc = pagerStmt
28840 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20  Begin(pPager);. 
28850 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
28860 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
28870 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
28880 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  t a statement..*
28890 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
288a0 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67  erStmtCommit(Pag
288b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70  er *pPager){.  p
288c0 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
288d0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
288e0 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
288f0 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
28900 4e 65 78 74 3b 0a 20 20 20 20 50 41 47 45 52 54  Next;.    PAGERT
28910 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d  RACE2("STMT-COMM
28920 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
28930 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
28940 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
28950 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73      /* sqlite3Os
28960 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
28970 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20  >stfd, 0); */.  
28980 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
28990 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
289a0 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20  >pInStmt);.     
289b0 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74   pPager->pInStmt
289c0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
289d0 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
289e0 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
289f0 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
28a00 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
28a10 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
28a20 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
28a30 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ger);.        pN
28a40 65 78 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  ext = pHist->pNe
28a50 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  xtStmt;.        
28a60 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69  assert( pHist->i
28a70 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20  nStmt );.       
28a80 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d   pHist->inStmt =
28a90 20 30 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   0;.        pHis
28aa0 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
28ab0 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
28ac0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
28ad0 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d  ite3_free(pHist-
28ae0 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  >pStmt);.       
28af0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
28b00 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
28b10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
28b20 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70  tNRec = 0;.    p
28b30 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
28b40 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
28b50 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  ->pStmt = 0;.  }
28b60 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
28b70 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70  utoopen = 0;.  p
28b80 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
28b90 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
28ba0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
28bb0 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  Rollback a state
28bc0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
28bd0 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c  ite3PagerStmtRol
28be0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
28bf0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
28c00 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
28c10 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
28c20 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
28c30 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32  .    PAGERTRACE2
28c40 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20  ("STMT-ROLLBACK 
28c50 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28c60 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
28c70 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
28c80 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
28c90 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
28ca0 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  st;.      for(pP
28cb0 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
28cc0 20 70 50 67 3b 20 70 50 67 3d 70 48 69 73 74 2d   pPg; pPg=pHist-
28cd0 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20  >pNextStmt){.   
28ce0 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
28cf0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
28d00 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
28d10 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
28d20 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
28d30 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
28d40 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d  ATA(pPg), pHist-
28d50 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e  >pStmt, pPager->
28d60 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
28d70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28d80 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
28d90 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74  .          pHist
28da0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
28db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28dc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
28dd0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  ize = pPager->st
28de0 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61  mtSize;.      pa
28df0 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
28e00 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
28e10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
28e20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28e30 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74     rc = pager_st
28e40 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  mt_playback(pPag
28e50 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
28e60 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
28e70 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
28e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
28e90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
28ea0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
28eb0 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61  toopen = 0;.  pa
28ec0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
28ed0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
28ee0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
28ef0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
28f00 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
28f10 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
28f20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
28f30 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  erFilename(Pager
28f40 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
28f50 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
28f60 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
28f70 52 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73  Return the VFS s
28f80 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
28f90 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   pager..*/.const
28fa0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71   sqlite3_vfs *sq
28fb0 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 50 61  lite3PagerVfs(Pa
28fc0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28fd0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
28fe0 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Vfs;.}../*.** Re
28ff0 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61  turn the file ha
29000 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74  ndle for the dat
29010 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63  abase file assoc
29020 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
29030 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d  e pager.  This m
29040 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ight return NULL
29050 20 69 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   if the file has
29060 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  .** not yet been
29070 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69   opened..*/.sqli
29080 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65  te3_file *sqlite
29090 33 50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72  3PagerFile(Pager
290a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
290b0 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  urn pPager->fd;.
290c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
290d0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66  the directory of
290e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
290f0 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
29100 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44  r *sqlite3PagerD
29110 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  irname(Pager *pP
29120 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
29130 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
29140 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ry;.}../*.** Ret
29150 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
29160 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
29170 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  rnal file..*/.co
29180 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
29190 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d  3PagerJournalnam
291a0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
291b0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
291c0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a  r->zJournal;.}..
291d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
291e0 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c  e if fsync() cal
291f0 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20  ls are disabled 
29200 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
29210 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
29220 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65   if fsync()s are
29230 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c   executed normal
29240 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
29250 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61  e3PagerNosync(Pa
29260 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
29270 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
29280 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  oSync;.}..#ifdef
29290 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
292a0 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  C./*.** Set the 
292b0 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
292c0 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
292d0 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65  ite3PagerSetCode
292e0 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
292f0 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  er,.  void *(*xC
29300 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
29310 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76  *,Pgno,int),.  v
29320 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29  oid *pCodecArg.)
29330 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  {.  pPager->xCod
29340 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70  ec = xCodec;.  p
29350 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67  Pager->pCodecArg
29360 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a   = pCodecArg;.}.
29370 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
29380 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
29390 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76  VACUUM./*.** Mov
293a0 65 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74  e the page pPg t
293b0 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20  o location pgno 
293c0 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  in the file..**.
293d0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
293e0 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74   no references t
293f0 6f 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  o the page previ
29400 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74  ously located at
29410 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20  .** pgno (which 
29420 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20  we call pPgOld) 
29430 74 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65  though that page
29440 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62   is allowed to b
29450 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20  e.** in cache.  
29460 49 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76  If the page prev
29470 69 6f 75 73 20 6c 6f 63 61 74 65 64 20 61 74 20  ious located at 
29480 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65  pgno is not alre
29490 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f  ady.** in the ro
294a0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
294b0 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68  it is not put th
294c0 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72  ere by by this r
294d0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
294e0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
294f0 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20  page pPg remain 
29500 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
29510 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
29520 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
29530 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20   pPg (i.e. data 
29540 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
29550 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
29560 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
29570 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
29580 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
29590 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
295a0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
295b0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
295c0 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
295d0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
295e0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
295f0 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
29600 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
29610 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
29620 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
29630 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
29640 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
29650 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
29660 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
29670 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
29680 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
29690 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
296a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
296b0 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67  agerMovepage(Pag
296c0 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61  er *pPager, DbPa
296d0 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67  ge *pPg, Pgno pg
296e0 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
296f0 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70 61  gOld;  /* The pa
29700 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  ge being overwri
29710 74 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 68  tten. */.  int h
29720 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e  ;.  Pgno needSyn
29730 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 70 61  cPgno = 0;..  pa
29740 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
29750 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
29760 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41  >nRef>0 );..  PA
29770 47 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20  GERTRACE5("MOVE 
29780 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64  %d page %d (need
29790 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74  Sync=%d) moves t
297a0 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  o %d\n", .      
297b0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
297c0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
297d0 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29  >needSync, pgno)
297e0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f  ;.  IOTRACE(("MO
297f0 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20  VE %p %d %d\n", 
29800 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
29810 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67  o, pgno))..  pag
29820 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
29830 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg);.  if( pPg->
29840 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
29850 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70  needSyncPgno = p
29860 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73  Pg->pgno;.    as
29870 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
29880 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 67 6e  rnal || (int)pgn
29890 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
298a0 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
298b0 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  rt( pPg->dirty )
298c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
298d0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
298e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
298f0 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 73 20  nk pPg from its 
29900 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20  hash-chain */.  
29910 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
29920 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20  pPager, pPg);.. 
29930 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
29940 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65   contains a page
29950 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
29960 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69  r pgno, remove i
29970 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20  t.  ** from its 
29980 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
29990 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e  , if the PgHdr.n
299a0 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20  eedSync was set 
299b0 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70  for .  ** page p
299c0 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27  gno before the '
299d0 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c  move' operation,
299e0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
299f0 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66  retained .  ** f
29a00 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65  or the page move
29a10 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  d there..  */.  
29a20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
29a30 30 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61  0;.  pPgOld = pa
29a40 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
29a50 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
29a60 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73  pPgOld ){.    as
29a70 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52  sert( pPgOld->nR
29a80 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c  ef==0 );.    unl
29a90 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
29aa0 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20  ger, pPgOld);.  
29ab0 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f    makeClean(pPgO
29ac0 6c 64 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65  ld);.    pPg->ne
29ad0 65 64 53 79 6e 63 20 3d 20 70 50 67 4f 6c 64 2d  edSync = pPgOld-
29ae0 3e 6e 65 65 64 53 79 6e 63 3b 0a 20 20 7d 65 6c  >needSync;.  }el
29af0 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65  se{.    pPg->nee
29b00 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  dSync = 0;.  }. 
29b10 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
29b20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  = sqlite3BitvecT
29b30 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
29b40 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 0a  ournal, pgno);..
29b50 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
29b60 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
29b70 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69  pPg and insert i
29b80 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68  t into the new h
29b90 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20  ash-chain. */.  
29ba0 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
29bb0 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  );.  pPg->pgno =
29bc0 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e   pgno;.  h = pgn
29bd0 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
29be0 73 68 2d 31 29 3b 0a 20 20 69 66 28 20 70 50 61  sh-1);.  if( pPa
29bf0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b  ger->aHash[h] ){
29c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
29c10 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
29c20 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
29c30 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
29c40 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  [h]->pPrevHash =
29c50 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
29c60 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61  >pNextHash = pPa
29c70 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20  ger->aHash[h];. 
29c80 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
29c90 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e  ] = pPg;.  pPg->
29ca0 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a  pPrevHash = 0;..
29cb0 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29    makeDirty(pPg)
29cc0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74  ;.  pPager->dirt
29cd0 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69  yCache = 1;..  i
29ce0 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  f( needSyncPgno 
29cf0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65  ){.    /* If nee
29d00 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e  dSyncPgno is non
29d10 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
29d20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65  journal file nee
29d30 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  ds to be .    **
29d40 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
29d50 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69   any data is wri
29d60 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65  tten to database
29d70 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53   file page needS
29d80 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20  yncPgno..    ** 
29d90 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75  Currently, no su
29da0 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69  ch page exists i
29db0 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
29dc0 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a   and the .    **
29dd0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
29de0 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e 20 73  l bit has been s
29df0 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74  et. This needs t
29e00 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79  o be remedied by
29e10 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20   loading.    ** 
29e20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
29e30 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
29e40 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67  d setting the Pg
29e50 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  Hdr.needSync fla
29e60 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g..    **.    **
29e70 20 49 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   If the attempt 
29e80 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67 65  to load the page
29e90 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d 63   into the page-c
29ea0 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75 65  ache fails, (due
29eb0 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c  .    ** to a mal
29ec0 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c  loc() or IO fail
29ed0 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65 20  ure), clear the 
29ee0 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f  bit in the pInJo
29ef0 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61  urnal[].    ** a
29f00 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  rray. Otherwise,
29f10 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
29f20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74 74  loaded and writt
29f30 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20  en again in.    
29f40 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  ** this transact
29f50 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20 77  ion, it may be w
29f60 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
29f70 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
29f80 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  re.    ** it is 
29f90 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
29fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
29fb0 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20 65  is way, it may e
29fc0 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20  nd up in.    ** 
29fd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29fe0 20 74 77 69 63 65 2c 20 62 75 74 20 74 68 61 74   twice, but that
29ff0 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65   is not a proble
2a000 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m..    **.    **
2a010 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   The sqlite3Page
2a020 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  rGet() call may 
2a030 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  cause the journa
2a040 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61  l to sync. So ma
2a050 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74  ke.    ** sure t
2a060 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
2a070 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  c flag is set to
2a080 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  o..    */.    in
2a090 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72 20  t rc;.    PgHdr 
2a0a0 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73  *pPgHdr;.    ass
2a0b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
2a0c0 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20  dSync );.    rc 
2a0d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2a0e0 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79  t(pPager, needSy
2a0f0 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29  ncPgno, &pPgHdr)
2a100 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2a110 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a120 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
2a130 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
2a140 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50  needSyncPgno<=pP
2a150 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
2a160 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2a170 74 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 70  te3BitvecClear(p
2a180 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2a190 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29  l, needSyncPgno)
2a1a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a1b0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
2a1c0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
2a1d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
2a1e0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
2a1f0 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  = 1;.    pPgHdr-
2a200 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
2a210 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75     pPgHdr->inJou
2a220 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61  rnal = 1;.    ma
2a230 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b  keDirty(pPgHdr);
2a240 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2a250 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
2a260 20 20 7d 0a 0a 20 20 70 61 67 65 72 4c 65 61 76    }..  pagerLeav
2a270 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
2a280 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2a290 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
2a2a0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
2a2b0 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  to the data for 
2a2c0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
2a2d0 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
2a2e0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
2a2f0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
2a300 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
2a310 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
2a320 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
2a330 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
2a340 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
2a350 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65  of "extra" space
2a360 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61   .** allocated a
2a370 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70  long with the sp
2a380 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
2a390 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
2a3a0 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61  gerGetExtra(DbPa
2a3b0 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
2a3c0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2a3d0 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72  >pPager;.  retur
2a3e0 6e 20 28 70 50 61 67 65 72 3f 50 47 48 44 52 5f  n (pPager?PGHDR_
2a3f0 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
2a400 61 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a  ager):0);.}../*.
2a410 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c  ** Get/set the l
2a420 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20  ocking-mode for 
2a430 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
2a440 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
2a450 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41   be one.** of PA
2a460 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2a470 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43  QUERY, PAGER_LOC
2a480 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
2a490 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43  or .** PAGER_LOC
2a4a0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2a4b0 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d  VE. If the param
2a4c0 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
2a4d0 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  RY, then.** the 
2a4e0 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20  locking-mode is 
2a4f0 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
2a500 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
2a510 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
2a520 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50  alue is either P
2a530 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2a540 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41  _NORMAL or.** PA
2a550 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2a560 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63  EXCLUSIVE, indic
2a570 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ating the curren
2a580 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
2a590 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d  ted).** locking-
2a5a0 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
2a5b0 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
2a5c0 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
2a5d0 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
2a5e0 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
2a5f0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2a600 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20  DE_QUERY.       
2a610 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
2a620 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2a630 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20  _NORMAL.        
2a640 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
2a650 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2a660 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
2a670 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
2a680 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30  KINGMODE_QUERY<0
2a690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2a6a0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2a6b0 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47  NORMAL>=0 && PAG
2a6c0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2a6d0 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20  XCLUSIVE>=0 );. 
2a6e0 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26   if( eMode>=0 &&
2a6f0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
2a700 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  le ){.    pPager
2a710 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2a720 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72  = eMode;.  }.  r
2a730 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
2a740 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2a750 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2a760 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72  TE_TEST./*.** Pr
2a770 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66  int a listing of
2a780 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20   all referenced 
2a790 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72 20  pages and their 
2a7a0 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f  ref count..*/.vo
2a7b0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  id sqlite3PagerR
2a7c0 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50  efdump(Pager *pP
2a7d0 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
2a7e0 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  pPg;.  for(pPg=p
2a7f0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
2a800 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
2a810 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50  All){.    if( pP
2a820 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e  g->nRef<=0 ) con
2a830 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  tinue;.    sqlit
2a840 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 50  e3DebugPrintf("P
2a850 41 47 45 20 25 33 64 20 61 64 64 72 3d 25 70 20  AGE %3d addr=%p 
2a860 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  nRef=%d\n", .   
2a870 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50      pPg->pgno, P
2a880 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
2a890 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20  ), pPg->nRef);. 
2a8a0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e   }.}.#endif..#en
2a8b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2a8c0 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a           IT_DISKIO */.