/ Hex Artifact Content
Login

Artifact d8690e166a5e3a3c65a04a35a96bbebeb368a6c7:


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: 34 20 32 30 30 38 2f 30 33 2f 30 37 20 32 30 3a  4 2008/03/07 20:
0360: 31 34 3a 33 39 20 64 72 68 20 45 78 70 20 24 0a  14:39 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 52 61 6e 64 6f 6d 6e    sqlite3Randomn
9b50: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
9b60: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
9b70: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
9b80: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
9b90: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
9ba0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
9bb0: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
9bc0: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
9bd0: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
9be0: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
9bf0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
9c00: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
9c10: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
9c20: 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  dbSize);.  /* Th
9c30: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
9c40: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
9c50: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
9c60: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
9c70: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9c80: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
9c90: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
9ca0: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
9cb0: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
9cc0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
9cd0: 6f 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f  ournalHdr, sizeo
9ce0: 66 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72  f(zHeader))).  r
9cf0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
9d00: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
9d10: 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  zHeader, sizeof(
9d20: 7a 48 65 61 64 65 72 29 2c 70 50 61 67 65 72 2d  zHeader),pPager-
9d30: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
9d40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9d50: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
9d60: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20  R_SZ(pPager);.. 
9d70: 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
9d80: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
9d90: 77 72 69 74 74 65 6e 20 73 75 63 63 65 73 73 66  written successf
9da0: 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a  ully. Seek the j
9db0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
9dc0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
9dd0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
9de0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
9df0: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tor..  */.  if( 
9e00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9e10: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
9e20: 54 41 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  TAIL %p %lld\n",
9e30: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
9e40: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a  >journalOff-1)).
9e50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9e60: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
9e70: 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 2c 20  jfd, "\000", 1, 
9e80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9e90: 66 66 2d 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ff-1);.  }.  ret
9ea0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9eb0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
9ec0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
9ed0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
9ee0: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
9ef0: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
9f00: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
9f10: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
9f20: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
9f30: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
9f40: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65  rnal.** file. Se
9f50: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
9f60: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
9f70: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20  ournalHdr() for 
9f80: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
9f90: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
9fa0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
9fb0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
9fc0: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
9fd0: 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69  ssfully, *nRec i
9fe0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
9ff0: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
a000: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
a010: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
a020: 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20   *dbSize is set 
a030: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
a040: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
a050: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
a060: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
a070: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
a080: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
a090: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
a0a0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
a0b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
a0c0: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
a0d0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
a0e0: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
a0f0: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
a100: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
a110: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
a120: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
a130: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
a140: 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64  and *nRec and *d
a150: 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65  bSize are not se
a160: 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  t.  If JOURNAL_H
a170: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
a180: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
a190: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
a1a0: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
a1b0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
a1c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
a1d0: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
a1e0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
a1f0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
a200: 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  ,.  u32 *pNRec, 
a210: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a  .  u32 *pDbSize.
a220: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
a230: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
a240: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
a250: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
a260: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
a270: 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 0a    i64 jrnlOff;..
a280: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
a290: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
a2a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a2b0: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
a2c0: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
a2d0: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
a2e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
a2f0: 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66  E;.  }.  jrnlOff
a300: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
a310: 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73  alOff;..  rc = s
a320: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
a330: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
a340: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
a350: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66  , jrnlOff);.  if
a360: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a370: 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73  ;.  jrnlOff += s
a380: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a  izeof(aMagic);..
a390: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
a3a0: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
a3b0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
a3c0: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  c))!=0 ){.    re
a3d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
a3e0: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65  ;.  }..  rc = re
a3f0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
a400: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70  >jfd, jrnlOff, p
a410: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
a420: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
a430: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a440: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
a450: 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d  lOff+4, &pPager-
a460: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69  >cksumInit);.  i
a470: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a480: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
a490: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
a4a0: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44  d, jrnlOff+8, pD
a4b0: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
a4c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
a4d0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
a4e0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
a4f0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
a500: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
a510: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
a520: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
a530: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
a540: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
a550: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
a560: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
a570: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
a580: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
a590: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
a5a0: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
a5b0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
a5c0: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
a5d0: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
a5e0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
a5f0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
a600: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
a610: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
a620: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
a630: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
a640: 31 32 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67  12, (u32 *)&pPag
a650: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
a660: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
a670: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
a680: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
a690: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
a6a0: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
a6b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
a6c0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
a6d0: 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
a6e0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
a6f0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
a700: 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
a710: 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
a720: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
a730: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
a740: 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
a750: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
a760: 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
a770: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
a780: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
a790: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
a7a0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
a7b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
a7c0: 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
a7d0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
a7e0: 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
a7f0: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
a800: 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
a810: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62   is:.**.** + 4 b
a820: 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50  ytes: PAGER_MJ_P
a830: 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65  GNO..** + N byte
a840: 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  s: length of mas
a850: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a860: 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  ..** + 4 bytes: 
a870: 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  N.** + 4 bytes: 
a880: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
a890: 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
a8a0: 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
a8b0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
a8c0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
a8d0: 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
a8e0: 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
a8f0: 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
a900: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
a910: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  rnal name..**.**
a920: 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
a930: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
a940: 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
a950: 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
a960: 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
a970: 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
a980: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
a990: 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
a9a0: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
a9b0: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
a9c0: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
a9d0: 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a  rc;.  int len; .
a9e0: 20 20 69 6e 74 20 69 3b 20 0a 20 20 69 36 34 20    int i; .  i64 
a9f0: 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75 33 32 20 63  jrnlOff;.  u32 c
aa00: 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72  ksum = 0;.  char
aa10: 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f   zBuf[sizeof(aJo
aa20: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d  urnalMagic)+2*4]
aa30: 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
aa40: 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74  r || pPager->set
aa50: 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53  Master) return S
aa60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
aa70: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
aa80: 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  1;..  len = strl
aa90: 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66  en(zMaster);.  f
aaa0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69  or(i=0; i<len; i
aab0: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
aac0: 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20  = zMaster[i];.  
aad0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
aae0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
aaf0: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
ab00: 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
ab10: 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
ab20: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
ab30: 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
ab40: 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
ab50: 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
ab60: 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
ab70: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
ab80: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
ab90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
aba0: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
abb0: 0a 20 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  .    seekJournal
abc0: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Hdr(pPager);.  }
abd0: 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61  .  jrnlOff = pPa
abe0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
abf0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
ac00: 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30  alOff += (len+20
ac10: 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  );..  rc = write
ac20: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
ac30: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47  fd, jrnlOff, PAG
ac40: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
ac50: 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  r));.  if( rc!=S
ac60: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
ac70: 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  n rc;.  jrnlOff 
ac80: 2b 3d 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71  += 4;..  rc = sq
ac90: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
aca0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
acb0: 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29  r, len, jrnlOff)
acc0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
acd0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
ace0: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
acf0: 6c 65 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69 74  len;..  put32bit
ad00: 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  s(zBuf, len);.  
ad10: 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b  put32bits(&zBuf[
ad20: 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65  4], cksum);.  me
ad30: 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61  mcpy(&zBuf[8], a
ad40: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
ad50: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ad60: 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ic));.  rc = sql
ad70: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
ad80: 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38  er->jfd, zBuf, 8
ad90: 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  +sizeof(aJournal
ada0: 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29  Magic), jrnlOff)
adb0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
adc0: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
add0: 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e  noSync;.  return
ade0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
adf0: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61  d or remove a pa
ae00: 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  ge from the list
ae10: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68   of all pages th
ae20: 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a  at are in the.**
ae30: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
ae40: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61  al..**.** The Pa
ae50: 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61  ger keeps a sepa
ae60: 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67  rate list of pag
ae70: 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  es that are curr
ae80: 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20  ently in.** the 
ae90: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
aea0: 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  l.  This helps t
aeb0: 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  he sqlite3PagerS
aec0: 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72  tmtCommit().** r
aed0: 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20  outine run MUCH 
aee0: 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63  faster for the c
aef0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
af00: 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a   there are many.
af10: 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f  ** pages in memo
af20: 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65  ry but only a fe
af30: 77 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  w are in the sta
af40: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
af50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
af60: 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
af70: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
af80: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
af90: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
afa0: 0a 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48  .  PgHistory *pH
afb0: 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
afc0: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
afd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44  ;.  assert( MEMD
afe0: 42 20 29 3b 0a 20 20 69 66 28 20 21 70 48 69 73  B );.  if( !pHis
aff0: 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20  t->inStmt ){.   
b000: 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
b010: 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20  pPrevStmt==0 && 
b020: 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
b030: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
b040: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a  Pager->pStmt ){.
b050: 20 20 20 20 20 20 50 47 48 44 52 5f 54 4f 5f 48        PGHDR_TO_H
b060: 49 53 54 28 70 50 61 67 65 72 2d 3e 70 53 74 6d  IST(pPager->pStm
b070: 74 2c 20 70 50 61 67 65 72 29 2d 3e 70 50 72 65  t, pPager)->pPre
b080: 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20  vStmt = pPg;.   
b090: 20 7d 0a 20 20 20 20 70 48 69 73 74 2d 3e 70 4e   }.    pHist->pN
b0a0: 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72  extStmt = pPager
b0b0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 61  ->pStmt;.    pPa
b0c0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
b0d0: 3b 0a 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53  ;.    pHist->inS
b0e0: 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  tmt = 1;.  }.}..
b0f0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
b100: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
b110: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
b120: 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ge number.  Retu
b130: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
b140: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
b150: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
b160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
b170: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
b180: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
b190: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
b1a0: 64 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61  dr *p;.  if( pPa
b1b0: 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20  ger->aHash==0 ) 
b1c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20  return 0;.  p = 
b1d0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67  pPager->aHash[pg
b1e0: 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
b1f0: 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65  ash-1)];.  while
b200: 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d  ( p && p->pgno!=
b210: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20  pgno ){.    p = 
b220: 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  p->pNextHash;.  
b230: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
b240: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
b250: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
b260: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
b270: 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ** sets the stat
b280: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62  e of the pager b
b290: 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77  ack to what it w
b2a0: 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66  as when it was f
b2b0: 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20  irst.** opened. 
b2c0: 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   Any outstanding
b2d0: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
b2e0: 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65  idated and subse
b2f0: 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a  quent attempts.*
b300: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73  * to access thos
b310: 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b  e pages will lik
b320: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ely result in a 
b330: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61  coredump..*/.sta
b340: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
b350: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
b360: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
b370: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28  g, *pNext;.  if(
b380: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
b390: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
b3a0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
b3b0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
b3c0: 74 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  t){.    IOTRACE(
b3d0: 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e  ("PGFREE %p %d\n
b3e0: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
b3f0: 70 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45  pgno));.    PAGE
b400: 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
b410: 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
b420: 74 29 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t);.    pNext = 
b430: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
b440: 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65     lruListRemove
b450: 28 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pPg);.    sqlit
b460: 65 33 5f 66 72 65 65 28 70 50 67 2d 3e 70 44 61  e3_free(pPg->pDa
b470: 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ta);.    sqlite3
b480: 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  _free(pPg);.  }.
b490: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
b4a0: 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30 29 3b  >lru.pFirst==0);
b4b0: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
b4c0: 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
b4d0: 65 64 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74  ed==0);.  assert
b4e0: 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 4c 61  (pPager->lru.pLa
b4f0: 73 74 3d 3d 30 29 3b 0a 20 20 70 50 61 67 65 72  st==0);.  pPager
b500: 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  ->pStmt = 0;.  p
b510: 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b  Pager->pAll = 0;
b520: 0a 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74  .  pPager->pDirt
b530: 79 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  y = 0;.  pPager-
b540: 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71  >nHash = 0;.  sq
b550: 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
b560: 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61  r->aHash);.  pPa
b570: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
b580: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20    pPager->aHash 
b590: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
b5a0: 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Ref = 0;.}../*.*
b5b0: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
b5c0: 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
b5d0: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
b5e0: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
b5f0: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73  error state, dis
b600: 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
b610: 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63  s of .** the cac
b620: 68 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  he and reset the
b630: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
b640: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e   internal state.
b650: 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   If there is.** 
b660: 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d  an open journal-
b670: 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e  file, then the n
b680: 65 78 74 20 74 69 6d 65 20 61 20 73 68 61 72 65  ext time a share
b690: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
b6a0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67  ed.** on the pag
b6b0: 65 72 20 66 69 6c 65 20 28 62 79 20 74 68 69 73  er file (by this
b6c0: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
b6d0: 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20  ocess), it will 
b6e0: 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73  be.** treated as
b6f0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
b700: 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  nd rolled back..
b710: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
b720: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65  ager_unlock(Page
b730: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
b740: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
b750: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
b760: 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
b770: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 55      int rc = osU
b780: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
b790: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
b7a0: 20 20 69 66 28 20 72 63 20 29 20 70 50 61 67 65    if( rc ) pPage
b7b0: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
b7c0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
b7d0: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
b7e0: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
b7f0: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
b800: 29 29 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  ))..      /* If 
b810: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73  Pager.errCode is
b820: 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e   set, the conten
b830: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
b840: 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a  cache cannot be.
b850: 20 20 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64        ** trusted
b860: 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70  . Now that the p
b870: 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c  ager file is unl
b880: 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65  ocked, the conte
b890: 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20  nts of the.     
b8a0: 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65   ** cache can be
b8b0: 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74   discarded and t
b8c0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61  he error code sa
b8d0: 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20  fely cleared..  
b8e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
b8f0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
b900: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
b910: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
b920: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b930: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b940: 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
b950: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
b960: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
b970: 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  mtOpen ){.      
b980: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
b990: 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  se(pPager->stfd)
b9a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
b9b0: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
b9c0: 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
b9d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
b9e0: 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30  ger->pInStmt = 0
b9f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ba00: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
ba10: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
ba20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ba30: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
ba40: 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
ba50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ba60: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pen = 0;.       
ba70: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
ba80: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
ba90: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
baa0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
bab0: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
bac0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bad0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
bae0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  n = 0;.        p
baf0: 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
bb00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
bb10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
bb20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
bb30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
bb40: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
bb50: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
bb60: 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  toopen = 0;.    
bb70: 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
bb80: 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  DbSize = 0;.    
bb90: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
bba0: 66 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 50 61  f( !MEMDB || pPa
bbb0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
bbc0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
bbd0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
bbe0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
bbf0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
bc00: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
bc10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
bc20: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
bc30: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
bc40: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
bc50: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
bc60: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
bc70: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
bc80: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
bc90: 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20  tered the error 
bca0: 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e 6f  state, .** do no
bcb0: 74 20 61 74 74 65 6d 70 74 20 74 68 65 20 72 6f  t attempt the ro
bcc0: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
bcd0: 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
bce0: 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
bcf0: 67 65 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ger *p){.  asser
bd00: 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  t( p->state>=PAG
bd10: 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70  ER_RESERVED || p
bd20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
bd30: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72   );.  if( p->err
bd40: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
bd50: 26 26 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  && p->state>=PAG
bd60: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
bd70: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
bd80: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a  ollback(p);.  }.
bd90: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
bda0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
bdb0: 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a  errCode || !p->j
bdc0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70  ournalOpen || (p
bdd0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26  ->exclusiveMode&
bde0: 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  &!p->journalOff)
bdf0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
be00: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e  >errCode || !p->
be10: 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65  stmtOpen || p->e
be20: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a  xclusiveMode );.
be30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
be40: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
be50: 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61  nsaction.  A tra
be60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
be70: 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61  d by either.** a
be80: 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
be90: 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LBACK..**.** Whe
bea0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
beb0: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
bec0: 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72  ger has the jour
bed0: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e  nal file open an
bee0: 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20  d.** a RESERVED 
bef0: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
bf00: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
bf10: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
bf20: 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a   will release.**
bf30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
bf40: 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  ck and acquires 
bf50: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e  a SHARED lock in
bf60: 20 69 74 73 20 70 6c 61 63 65 20 69 66 20 74 68   its place if th
bf70: 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70  at is.** the app
bf80: 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20 74  ropriate thing t
bf90: 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c  o do.  Release l
bfa0: 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20  ocks usually is 
bfb0: 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20  appropriate,.** 
bfc0: 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e  unless we are in
bfd0: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
bfe0: 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73  s mode or unless
bff0: 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43   this is a .** C
c000: 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20  OMMIT AND BEGIN 
c010: 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20  or ROLLBACK AND 
c020: 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e  BEGIN operation.
c030: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
c040: 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68 65  al file is eithe
c050: 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75  r deleted or tru
c060: 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  ncated..**.** TO
c070: 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65  DO: Consider kee
c080: 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ping the journal
c090: 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74   file open for t
c0a0: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
c0b0: 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68  es..** This migh
c0c0: 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
c0d0: 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74  ance improvement
c0e0: 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72   on windows wher
c0f0: 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66  e opening.** a f
c100: 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73  ile is an expens
c110: 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ive operation..*
c120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c130: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
c140: 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
c150: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
c160: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c170: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
c180: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c190: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
c1a0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
c1b0: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
c1c0: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
c1d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c1e0: 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
c1f0: 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
c200: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
c210: 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70  ->stmtOpen && !p
c220: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
c230: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
c240: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
c250: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50  r->stfd);.    pP
c260: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
c270: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
c280: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
c290: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  n ){.    if( pPa
c2a0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
c2b0: 64 65 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  de .          &&
c2c0: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
c2d0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
c2e0: 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54  >jfd, 0))==SQLIT
c2f0: 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20 70  E_OK ){;.      p
c300: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c310: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
c320: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
c330: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ted = 0;.    }el
c340: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
c350: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
c360: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61  >jfd);.      pPa
c370: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
c380: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
c390: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c3a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
c3b0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
c3c0: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
c3d0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
c3e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c3f0: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
c400: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
c410: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
c420: 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
c430: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f  rnal = 0;.    fo
c440: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
c450: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
c460: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
c470: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
c480: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
c490: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
c4a0: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
c4b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
c4c0: 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
c4d0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
c4e0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
c4f0: 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
c500: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
c510: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
c520: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
c530: 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
c540: 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
c550: 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70  Cache = 0;.    p
c560: 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
c570: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
c580: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
c590: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
c5a0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
c5b0: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
c5c0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   || pPager->useJ
c5d0: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ournal==0 );.  }
c5e0: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
c5f0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
c600: 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e  {.    rc2 = osUn
c610: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
c620: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
c630: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
c640: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
c650: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
c660: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
c670: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
c680: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
c690: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
c6a0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
c6b0: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
c6c0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
c6d0: 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
c6e0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
c6f0: 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73    lruListSetFirs
c700: 74 53 79 6e 63 65 64 28 70 50 61 67 65 72 29 3b  tSynced(pPager);
c710: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
c720: 65 20 3d 20 2d 31 3b 0a 0a 20 20 72 65 74 75 72  e = -1;..  retur
c730: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
c740: 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
c750: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
c760: 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
c770: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66   for the page of
c780: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   data..**.** Thi
c790: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
c7a0: 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73  checksum.  It is
c7b0: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
c7c0: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
c7d0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
c7e0: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67  alue and the pag
c7f0: 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78  e number.  We ex
c800: 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a  perimented with.
c810: 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66  ** a checksum of
c820: 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61   the entire data
c830: 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66  , but that was f
c840: 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73  ound to be too s
c850: 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  low..**.** Note 
c860: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75  that the page nu
c870: 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61  mber is stored a
c880: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
c890: 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74  of data and.** t
c8a0: 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73  he checksum is s
c8b0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
c8c0: 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  .  This is impor
c8d0: 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61  tant.  If journa
c8e0: 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  l.** corruption 
c8f0: 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
c900: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
c910: 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73  he most likely s
c920: 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68  cenario.** is th
c930: 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
c940: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
c950: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
c960: 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a  anged.  It is.**
c970: 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
c980: 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
c990: 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
c9a0: 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
c9b0: 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
c9c0: 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
c9d0: 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
c9e0: 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
c9f0: 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
ca00: 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
ca10: 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
ca20: 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
ca30: 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
ca40: 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43  **.** FIX ME:  C
ca50: 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65  onsider adding e
ca60: 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73  very 200th (or s
ca70: 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64  o) byte of the d
ca80: 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68  ata to the.** ch
ca90: 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61  ecksum.  That wa
caa0: 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61  y if a single pa
cab0: 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f  ge spans 3 or mo
cac0: 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20  re disk sectors 
cad0: 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20  and.** only the 
cae0: 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73  middle sector is
caf0: 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c   corrupt, we wil
cb00: 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72  l still have a r
cb10: 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61  easonable.** cha
cb20: 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74  nce of failing t
cb30: 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20  he checksum and 
cb40: 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74  thus detecting t
cb50: 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73  he problem..*/.s
cb60: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
cb70: 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
cb80: 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ger, const u8 *a
cb90: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
cba0: 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
cbb0: 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20  umInit;.  int i 
cbc0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
cbd0: 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28  ze-200;.  while(
cbe0: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
cbf0: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
cc00: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
cc10: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
cc20: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
cc30: 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
cc40: 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
cc50: 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a  ean(PgHdr*);../*
cc60: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
cc70: 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
cc80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
cc90: 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  ned on file desc
cca0: 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20  riptor.** jfd.  
ccb0: 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e  Playback this on
ccc0: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
ccd0: 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20   useCksum==0 it 
cce0: 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e  means this journ
ccf0: 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  al does not use 
cd00: 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63  checksums.  Chec
cd10: 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74  ksums.** are not
cd20: 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65   used in stateme
cd30: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61  nt journals beca
cd40: 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  use statement jo
cd50: 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a  urnals do not.**
cd60: 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65   need to survive
cd70: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e   power failures.
cd80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
cd90: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
cda0: 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72 20  e_page(.  Pager 
cdb0: 2a 70 50 61 67 65 72 2c 20 0a 20 20 73 71 6c 69  *pPager, .  sqli
cdc0: 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 0a 20  te3_file *jfd,. 
cdd0: 20 69 36 34 20 6f 66 66 73 65 74 2c 0a 20 20 69   i64 offset,.  i
cde0: 6e 74 20 75 73 65 43 6b 73 75 6d 0a 29 7b 0a 20  nt useCksum.){. 
cdf0: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
ce00: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
ce10: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
ce20: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
ce30: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
ce40: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce60: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
ce70: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
ce80: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
ce90: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
cea0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
ceb0: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
cec0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
ced0: 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75    u8 *aData = (u
cee0: 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
cef0: 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70  Space;   /* Temp
cf00: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70   storage for a p
cf10: 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65  age */..  /* use
cf20: 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20  Cksum should be 
cf30: 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69  true for the mai
cf40: 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61  n journal and fa
cf50: 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61  lse for.  ** sta
cf60: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
cf70: 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
cf80: 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  is is always the
cf90: 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73   case.  */.  ass
cfa0: 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65  ert( jfd == (use
cfb0: 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e  Cksum ? pPager->
cfc0: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74  jfd : pPager->st
cfd0: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
cfe0: 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20   aData );..  rc 
cff0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
d000: 2c 20 6f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  , offset, &pgno)
d010: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
d020: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
d030: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
d040: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61  3OsRead(jfd, aDa
d050: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
d060: 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
d070: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d080: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
d090: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
d0a0: 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72  nalOff += pPager
d0b0: 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a  ->pageSize + 4;.
d0c0: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
d0d0: 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
d0e0: 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
d0f0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
d100: 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
d110: 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
d120: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
d130: 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
d140: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
d150: 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
d160: 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
d170: 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
d180: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
d190: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
d1a0: 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
d1b0: 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
d1c0: 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
d1d0: 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
d1e0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
d1f0: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
d200: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
d210: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
d220: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d230: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
d240: 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65  f( pgno>(unsigne
d250: 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
d260: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
d270: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
d280: 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a  if( useCksum ){.
d290: 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
d2a0: 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2b  its(jfd, offset+
d2b0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d2c0: 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  +4, &cksum);.   
d2d0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
d2e0: 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
d2f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34  >journalOff += 4
d300: 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f  ;.    if( pager_
d310: 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44  cksum(pPager, aD
d320: 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
d330: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d340: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
d350: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
d360: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
d370: 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70  ER_RESERVED || p
d380: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
d390: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
d3a0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
d3b0: 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56  ger is in RESERV
d3c0: 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ED state, then t
d3d0: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
d3e0: 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
d3f0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
d400: 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
d410: 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
d420: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
d430: 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
d440: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
d450: 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
d460: 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
d470: 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
d480: 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
d490: 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
d4a0: 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
d4b0: 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
d4c0: 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
d4d0: 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
d4e0: 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
d4f0: 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
d500: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
d510: 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
d520: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
d530: 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
d540: 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
d550: 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
d560: 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
d570: 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
d580: 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
d590: 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
d5a0: 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
d5b0: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
d5c0: 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
d5d0: 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
d5e0: 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
d5f0: 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
d600: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
d610: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
d620: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
d630: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
d640: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
d650: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
d660: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
d670: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
d680: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
d690: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
d6a0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
d6b0: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
d6c0: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
d6d0: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
d6e0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
d6f0: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
d700: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
d710: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
d720: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
d730: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
d740: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
d750: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
d760: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
d770: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
d780: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
d790: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
d7a0: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
d7b0: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
d7c0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
d7d0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
d7e0: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
d7f0: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
d800: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
d810: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
d820: 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  re synced into t
d830: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
d840: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
d850: 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77  Otherwise, a pow
d860: 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65  er loss might le
d870: 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74  ave modified dat
d880: 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  a in the.  ** da
d890: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68  tabase file with
d8a0: 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  out an entry in 
d8b0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
d8c0: 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20  rnal that can.  
d8d0: 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  ** restore the d
d8e0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
d8f0: 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54  riginal form.  T
d900: 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  wo conditions mu
d910: 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62  st be.  ** met b
d920: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
d930: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
d940: 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74  les. (1) the dat
d950: 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20  abase must be.  
d960: 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  ** locked.  (2) 
d970: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
d980: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
d990: 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20  ontent is fully 
d9a0: 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74  synced.  ** in t
d9b0: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
d9c0: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
d9d0: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
d9e0: 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a  n cache or else.
d9f0: 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73    ** the page is
da00: 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
da10: 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70  ync==0..  */.  p
da20: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
da30: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
da40: 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22  .  PAGERTRACE4("
da50: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
da60: 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
da70: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
da80: 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
da90: 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
daa0: 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
dab0: 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29  pageSize, aData)
dac0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
dad0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
dae0: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
daf0: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
db00: 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69  ync==0) ){.    i
db10: 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
db20: 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
db30: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
db40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
db50: 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
db60: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
db70: 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
db80: 3b 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b  ;.    if( pPg ){
db90: 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
dba0: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
dbb0: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
dbc0: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
dbd0: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
dbe0: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
dbf0: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
dc00: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
dc10: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
dc20: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
dc30: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
dc40: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
dc50: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
dc60: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
dc70: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
dc80: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
dc90: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
dca0: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
dcb0: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
dcc0: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
dcd0: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
dce0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
dcf0: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
dd00: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
dd10: 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28  ;.    /* assert(
dd20: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
dd30: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b   pPg->pgno==1 );
dd40: 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20   */.    pData = 
dd50: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
dd60: 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  g);.    memcpy(p
dd70: 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61  Data, aData, pPa
dd80: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
dd90: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
dda0: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
ddb0: 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
ddc0: 69 74 65 72 28 70 50 67 2c 20 70 50 61 67 65 72  iter(pPg, pPager
ddd0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
dde0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
ddf0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
de00: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
de10: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
de20: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
de30: 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
de40: 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73  page 1, then res
de50: 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
de60: 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
de70: 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68  rs..    ** Do th
de80: 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65  is before any de
de90: 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
dea0: 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
deb0: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
dec0: 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
ded0: 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34  &((u8*)pData)[24
dee0: 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  ],sizeof(pPager-
def0: 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
df00: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
df10: 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73  ode the page jus
df20: 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  t read from disk
df30: 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70   */.    CODEC1(p
df40: 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
df50: 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d  g->pgno, 3);.  }
df60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
df70: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
df80: 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
df90: 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
dfa0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
dfb0: 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
dfc0: 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
dfd0: 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
dfe0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
dff0: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
e000: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
e010: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
e020: 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
e030: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
e040: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e050: 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
e060: 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
e070: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
e080: 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
e090: 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
e0a0: 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
e0b0: 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
e0c0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
e0d0: 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
e0e0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  nction..**.**.**
e0f0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
e100: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
e110: 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
e120: 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ll child journal
e130: 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66  s..** To tell if
e140: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
e150: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
e160: 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20  , check to each 
e170: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72  of the.** childr
e180: 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c  en.  If all chil
e190: 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20  dren are either 
e1a0: 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f  missing or do no
e1b0: 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20  t refer to.** a 
e1c0: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
e1d0: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74   journal, then t
e1e0: 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  his master journ
e1f0: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
e200: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
e210: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
e220: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
e230: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
e240: 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
e250: 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
e260: 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
e270: 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72  rc;.  int master
e280: 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c  _open = 0;.  sql
e290: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
e2a0: 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er;.  sqlite3_fi
e2b0: 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20  le *pJournal;.  
e2c0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
e2d0: 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
e2e0: 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
e2f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
e300: 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
e310: 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
e320: 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
e330: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
e340: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
e350: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e360: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
e370: 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  case some other 
e380: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20  process.  ** is 
e390: 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75  running this rou
e3a0: 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74  tine also. Not t
e3b0: 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f  hat it makes too
e3c0: 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65   much difference
e3d0: 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72  ..  */.  pMaster
e3e0: 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
e3f0: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
e400: 63 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  c(pVfs->szOsFile
e410: 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
e420: 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
e430: 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
e440: 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
e450: 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
e460: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
e470: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
e480: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
e490: 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
e4a0: 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
e4b0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
e4c0: 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
e4d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
e4e0: 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
e4f0: 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
e500: 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
e510: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e520: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
e530: 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70  out;.  master_op
e540: 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20  en = 1;..  rc = 
e550: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
e560: 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
e570: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
e580: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e590: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
e5a0: 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d  r_out;..  if( nM
e5b0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29  asterJournal>0 )
e5c0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75  {.    char *zJou
e5d0: 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a  rnal;.    char *
e5e0: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a  zMasterPtr = 0;.
e5f0: 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50      int nMasterP
e600: 74 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  tr = pPager->pVf
e610: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
e620: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
e630: 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
e640: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
e650: 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
e660: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
e670: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
e680: 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
e690: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
e6a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
e6b0: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
e6c0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
e6d0: 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
e6e0: 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 29  al + nMasterPtr)
e6f0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
e700: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
e710: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
e720: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
e730: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
e740: 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65      }.    zMaste
e750: 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
e760: 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
e770: 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d  urnal];.    rc =
e780: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
e790: 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
e7a0: 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a  ournal, nMasterJ
e7b0: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
e7c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e7d0: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
e7e0: 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f  er_out;..    zJo
e7f0: 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
e800: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
e810: 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
e820: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
e830: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
e840: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
e850: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
e860: 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
e870: 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20 29  ACCESS_EXISTS) )
e880: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  {.        /* One
e890: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
e8a0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
e8b0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e8c0: 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
e8d0: 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
e8e0: 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
e8f0: 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
e900: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
e910: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
e920: 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
e930: 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
e940: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
e950: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
e960: 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
e970: 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
e980: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
e990: 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
e9a0: 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  IN_JOURNAL);.   
e9b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e9c0: 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a  3OsOpen(pVfs, zJ
e9d0: 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c  ournal, pJournal
e9e0: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  , flags, 0);.   
e9f0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
ea00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ea10: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
ea20: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
ea30: 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  }..        rc = 
ea40: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
ea50: 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  l(pJournal, zMas
ea60: 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50  terPtr, nMasterP
ea70: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  tr);.        sql
ea80: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
ea90: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
eaa0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
eab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
eac0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
ead0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
eae0: 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72       c = zMaster
eaf0: 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72  Ptr[0]!=0 && str
eb00: 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
eb10: 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
eb20: 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
eb30: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
eb40: 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
eb50: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
eb60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
eb70: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
eb80: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
eb90: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
eba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75      }.      zJou
ebb0: 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28  rnal += (strlen(
ebc0: 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
ebd0: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20    }.  }.  .  rc 
ebe0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
ebf0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
ec00: 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
ec10: 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74  out:.  if( zMast
ec20: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
ec30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
ec40: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
ec50: 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65   }  .  if( maste
ec60: 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  r_open ){.    sq
ec70: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
ec80: 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ster);.  }.  sql
ec90: 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65  ite3_free(pMaste
eca0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
ecb0: 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .}...static void
ecc0: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
ecd0: 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
ece0: 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  ger);../*.** Tru
ecf0: 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66  ncate the main f
ed00: 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ile of the given
ed10: 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75   pager to the nu
ed20: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
ed30: 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c 73 6f   indicated. Also
ed40: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61   truncate the ca
ed50: 63 68 65 64 20 72 65 70 72 65 73 65 6e 74 61 74  ched representat
ed60: 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ion of the file.
ed70: 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20 6d 69 67  .**.** Might mig
ed80: 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
ed90: 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
eda0: 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
edb0: 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a 2a 20 54  than nPage..** T
edc0: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2c 20  his can happen, 
edd0: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  for example, if 
ede0: 77 65 20 61 72 65 20 69 6e 20 74 68 65 20 6d 69  we are in the mi
edf0: 64 64 6c 65 20 6f 66 20 61 20 74 72 61 6e 73 61  ddle of a transa
ee00: 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 68  ction.** which h
ee10: 61 73 20 65 78 74 65 6e 64 65 64 20 74 68 65 20  as extended the 
ee20: 66 69 6c 65 20 73 69 7a 65 20 61 6e 64 20 74 68  file size and th
ee30: 65 20 6e 65 77 20 70 61 67 65 73 20 61 72 65 20  e new pages are 
ee40: 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c 64 0a 2a  still all held.*
ee50: 2a 20 69 6e 20 63 61 63 68 65 2c 20 74 68 65 6e  * in cache, then
ee60: 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20 55 50   an INSERT or UP
ee70: 44 41 54 45 20 64 6f 65 73 20 61 20 73 74 61 74  DATE does a stat
ee80: 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20  ement rollback. 
ee90: 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72 61 74 69   Some.** operati
eea0: 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
eeb0: 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
eec0: 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 79 6f  t confused if yo
eed0: 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74 72 75 6e  u try to.** trun
eee0: 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
eef0: 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
ef00: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
ef10: 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 0a 2a 2a  currently is,.**
ef20: 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   so detect this 
ef30: 63 61 73 65 20 61 6e 64 20 64 6f 20 6e 6f 74 20  case and do not 
ef40: 64 6f 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  do the truncatio
ef50: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
ef60: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
ef70: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
ef80: 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  nt nPage){.  int
ef90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
efa0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
efb0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
efc0: 55 53 49 56 45 20 26 26 20 70 50 61 67 65 72 2d  USIVE && pPager-
efd0: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
efe0: 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
eff0: 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
f000: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f010: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
f020: 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69  ->fd, &currentSi
f030: 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ze);.    newSize
f040: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
f050: 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  ize*(i64)nPage;.
f060: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f070: 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
f080: 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a  Size>newSize ){.
f090: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f0a0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
f0b0: 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65  ger->fd, newSize
f0c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
f0d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f0e0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
f0f0: 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
f100: 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
f110: 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
f120: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
f130: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
f140: 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66  the sectorSize f
f150: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
f160: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  er..**.** The se
f170: 63 74 6f 72 20 73 69 7a 65 20 69 73 20 74 68 65  ctor size is the
f180: 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 73   larger of the s
f190: 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72  ector size repor
f1a0: 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
f1b0: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20  3OsSectorSize() 
f1c0: 61 6e 64 20 74 68 65 20 70 61 67 65 53 69 7a 65  and the pageSize
f1d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f1e0: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
f1f0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
f200: 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
f210: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
f220: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
f230: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
f240: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
f250: 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
f260: 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
f270: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
f280: 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
f290: 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
f2a0: 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
f2b0: 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69 68 20  d yet, in whcih 
f2c0: 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
f2d0: 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
f2e0: 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
f2f0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
f300: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
f310: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
f320: 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
f330: 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  d);.  }.  if( pP
f340: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
f350: 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  <pPager->pageSiz
f360: 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
f370: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 70 50  >sectorSize = pP
f380: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
f390: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
f3a0: 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
f3b0: 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
f3c0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
f3d0: 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
f3e0: 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
f3f0: 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
f400: 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
f410: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
f420: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
f430: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
f440: 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
f450: 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
f460: 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
f470: 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
f480: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
f490: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
f4a0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
f4b0: 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
f4c0: 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
f4d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
f4e0: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
f4f0: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
f500: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
f510: 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
f520: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
f530: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
f540: 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
f550: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
f560: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
f570: 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
f580: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
f590: 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
f5a0: 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
f5b0: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
f5c0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
f5d0: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
f5e0: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
f5f0: 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
f600: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
f610: 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
f620: 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
f630: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
f640: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
f650: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
f660: 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65        name.  The
f670: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
f680: 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61  ro (indicate tha
f690: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  t there is no ma
f6a0: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
f6b0: 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20  urnal.).**  (6) 
f6c0: 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   N bytes of the 
f6d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
f6e0: 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77  ame.  The name w
f6f0: 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69  ill be nul-termi
f700: 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61  nated.**       a
f710: 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  nd might be shor
f720: 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c  ter than the val
f730: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29  ue read from (5)
f740: 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20  .  If the first 
f750: 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  byte.**       of
f760: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30   the name is \00
f770: 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  0 then there is 
f780: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
f790: 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a  l.  The master.*
f7a0: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  *       journal 
f7b0: 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69  name is stored i
f7c0: 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29  n UTF-8..**  (7)
f7d0: 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
f7e0: 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
f7f0: 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
f800: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
f810: 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
f820: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
f830: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
f840: 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
f850: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
f860: 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
f870: 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
f880: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
f890: 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
f8a0: 68 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73  he first 6 items
f8b0: 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
f8c0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
f8d0: 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
f8e0: 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69  nce of the 7th i
f8f0: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
f900: 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
f910: 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
f920: 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
f930: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
f940: 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
f950: 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
f960: 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
f970: 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
f980: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
f990: 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
f9a0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
f9b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
f9c0: 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
f9d0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
f9e0: 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
f9f0: 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
fa00: 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
fa10: 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
fa20: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
fa30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
fa40: 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
fa50: 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
fa60: 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
fa70: 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
fa80: 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
fa90: 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
faa0: 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
fab0: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
fac0: 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
fad0: 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
fae0: 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
faf0: 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
fb00: 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
fb10: 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
fb20: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
fb30: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
fb40: 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
fb50: 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
fb60: 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
fb70: 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
fb80: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
fb90: 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
fba0: 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
fbb0: 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
fbc0: 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
fbd0: 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
fbe0: 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
fbf0: 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
fc00: 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
fc10: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
fc20: 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
fc30: 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
fc40: 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
fc50: 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
fc60: 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
fc70: 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
fc80: 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
fc90: 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
fca0: 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
fcb0: 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
fcc0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
fcd0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
fce0: 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
fcf0: 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
fd00: 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
fd10: 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
fd20: 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
fd30: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fd40: 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
fd50: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
fd60: 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
fd70: 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
fd80: 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
fd90: 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
fda0: 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
fdb0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
fdc0: 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
fdd0: 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
fde0: 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
fdf0: 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
fe00: 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
fe10: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
fe20: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
fe30: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
fe40: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
fe50: 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
fe60: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
fe70: 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
fe80: 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fea0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
feb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
fec0: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
fed0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
fee0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
fef0: 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
ff00: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
ff10: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
ff20: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
ff30: 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
ff40: 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
ff50: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
ff60: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
ff70: 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
ff80: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
ff90: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
ffa0: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
ffb0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
ffc0: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
ffd0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
ffe0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
fff0: 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20  ile if any */.. 
10000 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
10010 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
10020 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
10030 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
10040 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
10050 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
10060 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
10070 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
10080 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
10090 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
100a0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
100b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
100c0 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20  TE_OK || szJ==0 
100d0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
100e0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
100f0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
10100 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10110 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
10120 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
10130 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
10140 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10150 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
10160 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
10170 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
10180 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
10190 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
101a0 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
101b0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
101c0 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
101d0 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  back..  */.  zMa
101e0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
101f0 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
10200 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
10210 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
10220 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
10230 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
10240 65 2b 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e+1);.  assert( 
10250 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
10260 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10270 49 54 45 5f 4f 4b 20 0a 20 20 20 7c 7c 20 28 7a  ITE_OK .   || (z
10280 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 21 73 71  Master[0] && !sq
10290 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
102a0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
102b0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
102c0 53 29 29 20 0a 20 20 29 7b 0a 20 20 20 20 7a 4d  S)) .  ){.    zM
102d0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
102e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
102f0 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  NE ) rc = SQLITE
10300 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  _OK;.    goto en
10310 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
10320 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10330 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7a 4d 61 73  lOff = 0;.  zMas
10340 74 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  ter = 0;..  /* T
10350 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
10360 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
10370 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  the readJournalH
10380 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  dr() call return
10390 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  s.  ** SQLITE_DO
103a0 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
103b0 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77  r occurs. */.  w
103c0 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20  hile( 1 ){..    
103d0 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74  /* Read the next
103e0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
103f0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
10400 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
10410 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   are.    ** not 
10420 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66  enough bytes lef
10430 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
10440 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70   file for a comp
10450 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a  lete header, or.
10460 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72      ** it is cor
10470 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70  rupted, then a p
10480 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66  rocess must of f
10490 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
104a0 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
104b0 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
104c0 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
104d0 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
104e0 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
104f0 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
10500 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
10510 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
10520 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10530 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
10540 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
10550 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
10560 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10570 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
10580 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
10590 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
105a0 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
105b0 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
105c0 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
105d0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
105e0 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
105f0 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
10600 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
10610 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
10620 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
10630 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
10640 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
10650 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
10660 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
10670 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
10680 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
10690 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
106a0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
106b0 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
106c0 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
106d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
106e0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
106f0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
10700 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
10710 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
10720 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
10730 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
10740 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ger);.    }..   
10750 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
10760 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61   and this rollba
10770 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73  ck is of a trans
10780 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62  action created b
10790 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72  y this.    ** pr
107a0 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69  ocess and if thi
107b0 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68  s is the final h
107c0 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75  eader in the jou
107d0 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65  rnal, then it me
107e0 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ans.    ** that 
107f0 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
10800 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
10810 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61  ng filled but ha
10820 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20  s not yet been. 
10830 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20     ** synced to 
10840 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74  disk.  Compute t
10850 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
10860 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  es based on the 
10870 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  remaining.    **
10880 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
10890 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
108a0 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20   The third term 
108b0 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20  of the test was 
108c0 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63  added to fix tic
108d0 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a  ket #2565..    *
108e0 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
108f0 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20  0 && !isHot &&. 
10900 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
10910 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
10920 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
10930 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
10940 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  lOff ){.      nR
10950 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67  ec = (szJ - pPag
10960 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
10970 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
10980 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPager);.    }..
10990 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
109a0 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
109b0 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
109c0 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
109d0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
109e0 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
109f0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
10a00 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
10a10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
10a20 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
10a30 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
10a40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
10a50 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
10a60 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
10a70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10a80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10a90 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
10aa0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
10ab0 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
10ac0 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
10ad0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
10ae0 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
10af0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
10b00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
10b10 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
10b20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
10b30 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
10b40 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
10b50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
10b60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31  r->journalOff, 1
10b70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
10b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10b90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
10ba0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
10bb0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
10bc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
10bd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10be0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
10bf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10c00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10c10 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
10c20 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
10c30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10c40 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
10c50 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
10c60 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
10c70 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  k:.  if( rc==SQL
10c80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d  ITE_OK ){.    zM
10c90 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
10ca0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72  pTmpSpace;.    r
10cb0 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
10cc0 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
10cd0 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
10ce0 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
10cf0 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d 0a 20 20 69  name+1);.  }.  i
10d00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10d10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
10d20 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
10d30 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  on(pPager);.  }.
10d40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10d50 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
10d60 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  ] ){.    /* If t
10d70 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
10d80 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
10d90 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
10da0 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a  return success,.
10db0 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
10dc0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
10dd0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
10de0 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
10df0 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
10e00 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65  _delmaster(pPage
10e10 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d  r, zMaster);.  }
10e20 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
10e30 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
10e40 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
10e50 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
10e60 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
10e70 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
10e80 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
10e90 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
10ea0 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
10eb0 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
10ec0 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
10ed0 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
10ee0 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
10ef0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
10f00 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
10f10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
10f20 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74  layback the stat
10f30 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
10f40 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d  *.** This is sim
10f50 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20  ilar to playing 
10f60 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
10f70 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74  tion journal but
10f80 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65   with.** a few e
10f90 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a  xtra twists..**.
10fa0 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e  **    (1)  The n
10fb0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
10fc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
10fd0 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ile at the start
10fe0 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74   of.**         t
10ff0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
11000 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72  stored in pPager
11010 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20  ->stmtSize, not 
11020 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
11030 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
11040 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tself..**.**    
11050 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  (2)  In addition
11060 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
11070 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
11080 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20  ournal, also.** 
11090 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b          playback
110a0 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68   all pages of th
110b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
110c0 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a  urnal beginning.
110d0 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66  **         at of
110e0 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d  fset pPager->stm
110f0 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  tJSize..*/.stati
11100 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74  c int pager_stmt
11110 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
11120 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
11130 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
11140 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11150 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c  the full journal
11160 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66   */.  i64 hdrOff
11170 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  ;.  int nRec;   
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11190 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
111a0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111c0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
111d0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
111e0 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
111f0 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65  urnalOff;.#ifnde
11200 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20  f NDEBUG .  {.  
11210 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20    i64 os_szJ;.  
11220 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11230 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
11240 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a  >jfd, &os_szJ);.
11250 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11260 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
11270 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  c;.    assert( s
11280 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20  zJ==os_szJ );.  
11290 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
112a0 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20  et hdrOff to be 
112b0 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20  the offset just 
112c0 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66  after the end of
112d0 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61   the last journa
112e0 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74  l.  ** page writ
112f0 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66  ten before the f
11300 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
11310 64 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61  der for this sta
11320 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e  tement.  ** tran
11330 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74  saction was writ
11340 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20  ten, or the end 
11350 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e  of the file if n
11360 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68  o journal.  ** h
11370 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
11380 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66  n..  */.  hdrOff
11390 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48   = pPager->stmtH
113a0 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  drOff;.  assert(
113b0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
113c0 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a  c || !hdrOff );.
113d0 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b    if( !hdrOff ){
113e0 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a  .    hdrOff = sz
113f0 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  J;.  }.  .  /* T
11400 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
11410 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73  base back to its
11420 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
11430 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
11440 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
11450 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  r, pPager->stmtS
11460 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
11470 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
11480 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a  AGER_SHARED );..
11490 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
114a0 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
114b0 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
114c0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
114d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
114e0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
114f0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
11500 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63  alOpen );.  nRec
11510 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
11520 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70  Rec;.  .  /* Cop
11530 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
11540 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74   out of the stat
11550 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  ement journal an
11560 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a  d back into the.
11570 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
11580 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  le.  Note that t
11590 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
115a0 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b  rnal omits check
115b0 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65  sums from.  ** e
115c0 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65  ach record since
115d0 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72   power-failure r
115e0 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69  ecovery is not i
115f0 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74  mportant to stat
11600 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ement.  ** journ
11610 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  als..  */.  for(
11620 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
11630 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  ){.    i64 offse
11640 74 20 3d 20 69 2a 28 34 2b 70 50 61 67 65 72 2d  t = i*(4+pPager-
11650 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
11660 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
11670 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
11680 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66  ger, pPager->stf
11690 64 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20  d, offset, 0);. 
116a0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
116b0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
116c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
116d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
116e0 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
116f0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c  }..  /* Now roll
11700 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b   some pages back
11710 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61   from the transa
11720 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50  ction journal. P
11730 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20  ager.stmtJSize. 
11740 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65   ** was the size
11750 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
11760 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73  file when this s
11770 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61  tatement was sta
11780 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76  rted, so.  ** ev
11790 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74  erything after t
117a0 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
117b0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74  rolled back, eit
117c0 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  her into the.  *
117d0 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  * database, the 
117e0 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72  memory cache, or
117f0 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   both..  **.  **
11800 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65   If it is not ze
11810 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73  ro, then Pager.s
11820 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65  tmtHdrOff is the
11830 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
11840 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
11850 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
11860 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75  eader written du
11870 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d  ring this statem
11880 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
11890 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
118a0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61  journalOff = pPa
118b0 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a  ger->stmtJSize;.
118c0 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49    pPager->cksumI
118d0 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  nit = pPager->st
118e0 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65  mtCksum;.  while
118f0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
11900 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b  lOff < hdrOff ){
11910 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
11920 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
11930 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
11940 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
11950 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20  ournalOff, 1);. 
11960 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
11970 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
11980 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11990 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
119a0 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
119b0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67  }..  while( pPag
119c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
119d0 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20   szJ ){.    u32 
119e0 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f  nJRec;         /
119f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
11a00 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
11a10 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
11a20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
11a30 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
11a40 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
11a50 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  y);.    if( rc!=
11a60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11a70 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
11a80 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
11a90 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d      goto end_stm
11aa0 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
11ab0 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  }.    if( nJRec=
11ac0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65  =0 ){.      nJRe
11ad0 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
11ae0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
11af0 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
11b00 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ze+8);.    }.   
11b10 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20   for(i=nJRec-1; 
11b20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  i>=0 && pPager->
11b30 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
11b40 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ; i--){.      rc
11b50 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
11b60 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
11b70 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
11b80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11b90 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73  ff, 1);.      as
11ba0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
11bb0 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69  _DONE );.      i
11bc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11bd0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
11be0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
11bf0 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
11c00 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
11c10 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c  ;.  .end_stmt_pl
11c20 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
11c30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20  ==SQLITE_OK) {. 
11c40 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
11c50 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
11c60 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64   /* pager_reload
11c70 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20  _cache(pPager); 
11c80 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
11c90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
11ca0 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
11cb0 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
11cc0 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
11cd0 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
11ce0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
11cf0 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
11d00 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
11d10 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
11d20 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20  xPage>10 ){.    
11d30 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
11d40 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65   mxPage;.  }else
11d50 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
11d60 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d  Page = 10;.  }.}
11d70 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
11d80 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
11d90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
11da0 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
11db0 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
11dc0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
11dd0 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
11de0 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
11df0 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
11e00 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
11e10 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
11e20 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
11e30 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
11e40 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
11e50 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
11e60 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
11e70 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
11e80 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
11e90 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
11ea0 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
11eb0 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
11ec0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
11ed0 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
11ee0 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
11ef0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
11f00 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
11f10 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
11f20 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
11f30 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
11f40 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
11f50 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
11f60 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
11f70 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
11f80 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
11f90 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
11fa0 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
11fb0 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
11fc0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
11fd0 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
11fe0 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
11ff0 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
12000 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
12010 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
12020 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
12030 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
12040 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
12050 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
12060 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
12070 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
12090 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
120a0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
120b0 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
120c0 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
120d0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
120e0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
120f0 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
12100 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
12110 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
12120 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
12130 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
12140 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
12150 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
12160 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
12170 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
12180 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
121a0 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
121b0 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
121c0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
121d0 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
121e0 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
121f0 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
12200 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
12210 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
12220 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
12230 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
12240 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
12250 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
12260 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
12270 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
12280 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
12290 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
122a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
122b0 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72  afetyLevel(Pager
122c0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65   *pPager, int le
122d0 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73  vel, int full_fs
122e0 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ync){.  pPager->
122f0 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d  noSync =  level=
12300 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
12310 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
12320 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76  ->fullSync = lev
12330 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
12340 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
12350 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
12360 20 3d 20 28 66 75 6c 6c 5f 66 73 79 6e 63 3f 53   = (full_fsync?S
12370 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a  QLITE_SYNC_FULL:
12380 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
12390 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  AL);.  if( pPage
123a0 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
123b0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
123c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
123d0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
123e0 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
123f0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
12400 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
12410 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
12420 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
12430 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
12440 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
12450 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
12460 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
12470 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
12480 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
12490 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
124a0 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
124b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
124c0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
124d0 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  e. .**.** Write 
124e0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
124f0 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52  tor into *fd.  R
12500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
12510 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f  on success or so
12520 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f  me.** other erro
12530 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
12540 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  l. The OS will a
12550 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
12560 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
12570 79 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 69  y.** file when i
12580 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  t is closed..*/.
12590 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
125a0 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
125b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
125c0 70 56 66 73 2c 20 20 20 20 2f 2a 20 54 68 65 20  pVfs,    /* The 
125d0 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
125e0 74 65 6d 20 6c 61 79 65 72 20 2a 2f 0a 20 20 73  tem layer */.  s
125f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
12600 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
12610 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
12620 72 20 68 65 72 65 20 2a 2f 0a 20 20 63 68 61 72  r here */.  char
12630 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
12640 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
12650 20 66 69 6c 65 2e 20 20 4d 69 67 68 74 20 62 65   file.  Might be
12660 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 76   NULL */.  int v
12670 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
12680 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
12690 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
126a0 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  VFS */.){.  int 
126b0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 46  rc;.  assert( zF
126c0 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 0a 23  ilename!=0 );..#
126d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
126e0 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
126f0 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
12700 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
12710 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
12720 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
12730 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
12740 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
12750 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
12760 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
12770 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
12780 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
12790 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
127a0 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
127b0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
127c0 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
127d0 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
127e0 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
127f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
12800 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
12810 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
12820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
12830 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
12840 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
12850 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
12860 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
12870 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
12880 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
12890 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
128a0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
128b0 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
128c0 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
128d0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
128e0 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
128f0 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
12900 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
12910 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
12920 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
12930 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
12940 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
12950 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
12960 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
12970 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
12980 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
12990 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
129a0 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
129b0 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
129c0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
129d0 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
129e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
129f0 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
12a00 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
12a10 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
12a20 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
12a30 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
12a40 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
12a50 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
12a60 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
12a70 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
12a80 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
12a90 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
12aa0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
12ab0 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
12ac0 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
12ad0 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
12ae0 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
12af0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
12b00 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
12b10 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
12b20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
12b30 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
12b40 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
12b50 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
12b60 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b80 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
12b90 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
12ba0 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
12bb0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
12bc0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
12bd0 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
12be0 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
12bf0 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
12c00 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
12c10 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
12c20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
12c30 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  n() */.){.  u8 *
12c40 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
12c50 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Pager = 0;.  int
12c60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12c70 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
12c80 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  tempFile = 0;.  
12c90 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20  int memDb = 0;. 
12ca0 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
12cb0 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  0;.  int useJour
12cc0 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
12cd0 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
12ce0 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52  L)==0;.  int noR
12cf0 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73  eadlock = (flags
12d00 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44   & PAGER_NO_READ
12d10 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74 20  LOCK)!=0;.  int 
12d20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
12d30 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
12d40 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 69 6e  Size(pVfs);.  in
12d50 74 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d  t nDefaultPage =
12d60 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
12d70 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63 68 61  PAGE_SIZE;.  cha
12d80 72 20 2a 7a 50 61 74 68 6e 61 6d 65 3b 0a 20 20  r *zPathname;.  
12d90 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 3b 0a 0a  int nPathname;..
12da0 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
12db0 20 72 65 74 75 72 6e 20 69 73 20 61 20 4e 55 4c   return is a NUL
12dc0 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a  L pointer */.  *
12dd0 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20  ppPager = 0;..  
12de0 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66  /* Compute the f
12df0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 2a 2f 0a  ull pathname */.
12e00 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
12e10 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
12e20 3b 0a 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ;.  zPathname = 
12e30 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
12e40 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Pathname);.  if(
12e50 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
12e60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12e70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
12e80 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
12e90 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
12ea0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12eb0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
12ec0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
12ed0 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
12ee0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
12ef0 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
12f00 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
12f10 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
12f20 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72  if.    {.      r
12f30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
12f40 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
12f50 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
12f60 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29  name, zPathname)
12f70 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
12f80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12f90 33 4f 73 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  3OsGetTempname(p
12fa0 56 66 73 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  Vfs, nPathname, 
12fb0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
12fc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12fd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
12fe0 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
12ff0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
13000 63 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 68 6e 61  c;.  }.  nPathna
13010 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 50 61 74  me = strlen(zPat
13020 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c  hname);..  /* Al
13030 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
13040 72 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  r the pager stru
13050 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61 67 65  cture */.  pPage
13060 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  r = sqlite3Mallo
13070 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a 65 6f  cZero(.    sizeo
13080 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20 20 20  f(*pPager) +    
13090 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
130a0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
130b0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
130c0 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
130d0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
130e0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 20 0a 20   structure */ . 
130f0 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c     pVfs->szOsFil
13100 65 20 2a 20 33 20 2b 20 20 20 20 20 20 20 20 2f  e * 3 +        /
13110 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 61 6e  * The main db an
13120 64 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  d two journal fi
13130 6c 65 73 20 2a 2f 20 0a 20 20 20 20 34 2a 6e 50  les */ .    4*nP
13140 61 74 68 6e 61 6d 65 20 2b 20 34 30 20 20 20 20  athname + 40    
13150 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
13160 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f 72 79  name, zDirectory
13170 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 53 74 6d  , zJournal, zStm
13180 74 4a 72 6e 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20  tJrnl */.  );.  
13190 69 66 28 20 21 70 50 61 67 65 72 20 29 7b 0a 20  if( !pPager ){. 
131a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
131b0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
131c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
131d0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 74 72 20  MEM;.  }.  pPtr 
131e0 3d 20 28 75 38 20 2a 29 26 70 50 61 67 65 72 5b  = (u8 *)&pPager[
131f0 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66  1];.  pPager->vf
13200 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67  sFlags = vfsFlag
13210 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  s;.  pPager->fd 
13220 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
13230 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f  )&pPtr[pVfs->szO
13240 73 46 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67  sFile*0];.  pPag
13250 65 72 2d 3e 73 74 66 64 20 3d 20 28 73 71 6c 69  er->stfd = (sqli
13260 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b  te3_file*)&pPtr[
13270 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 31  pVfs->szOsFile*1
13280 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64  ];.  pPager->jfd
13290 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
132a0 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
132b0 4f 73 46 69 6c 65 2a 32 5d 3b 0a 20 20 70 50 61  OsFile*2];.  pPa
132c0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
132d0 20 28 63 68 61 72 2a 29 26 70 50 74 72 5b 70 56   (char*)&pPtr[pV
132e0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 2b 6a  fs->szOsFile*2+j
132f0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d 3b  ournalFileSize];
13300 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  .  pPager->zDire
13310 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d  ctory = &pPager-
13320 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68  >zFilename[nPath
13330 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65  name+1];.  pPage
13340 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
13350 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
13360 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a  y[nPathname+1];.
13370 20 20 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a    pPager->zStmtJ
13380 72 6e 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  rnl = &pPager->z
13390 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
133a0 65 2b 31 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d  e+10];.  pPager-
133b0 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
133c0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
133d0 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Filename, zPathn
133e0 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31  ame, nPathname+1
133f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
13400 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20  e(zPathname);.. 
13410 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
13420 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
13430 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
13440 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26   zFilename[0] &&
13450 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69   !memDb ){.    i
13460 66 28 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56  f( nPathname>(pV
13470 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d  fs->mxPathname -
13480 20 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61   sizeof("-journa
13490 6c 22 29 29 20 29 7b 0a 20 20 20 20 20 20 72 63  l")) ){.      rc
134a0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
134b0 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EN;.    }else{. 
134c0 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
134d0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
134e0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
134f0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
13500 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ame, pPager->fd,
13510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13520 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
13530 2d 3e 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75  ->vfsFlags, &fou
13540 74 29 3b 0a 20 20 20 20 20 20 72 65 61 64 4f 6e  t);.      readOn
13550 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
13560 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
13570 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
13580 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63  he file was succ
13590 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20  essfully opened 
135a0 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
135b0 63 63 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a 20  ccess,.      ** 
135c0 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
135d0 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
135e0 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
135f0 65 61 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  eate the.      *
13600 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
13610 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   The default pag
13620 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61  e size is the ma
13630 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20 20  ximum of:.      
13640 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b  **.      **    +
13650 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
13660 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20  PAGE_SIZE,.     
13670 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c   **    + The val
13680 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
13690 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
136a0 7a 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  ze().      **   
136b0 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
136c0 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
136d0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
136e0 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20 2a  mically..      *
136f0 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
13700 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65  SQLITE_OK && !re
13710 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
13720 20 20 69 6e 74 20 69 53 65 63 74 6f 72 53 69 7a    int iSectorSiz
13730 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
13740 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
13750 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fd);.        if(
13760 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3c 69 53   nDefaultPage<iS
13770 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20  ectorSize ){.   
13780 20 20 20 20 20 20 20 6e 44 65 66 61 75 6c 74 50         nDefaultP
13790 61 67 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a  age = iSectorSiz
137a0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66  e;.        }.#if
137b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
137c0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
137d0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
137e0 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
137f0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
13800 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
13810 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20  er->fd);.       
13820 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
13830 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
13840 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
13850 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
13860 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
13870 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
13880 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
13890 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
138a0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
138b0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
138c0 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
138d0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 6e 44 65        for(ii=nDe
138e0 66 61 75 6c 74 50 61 67 65 3b 20 69 69 3c 3d 53  faultPage; ii<=S
138f0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
13900 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d  T_PAGE_SIZE; ii=
13910 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20  ii*2){.         
13920 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
13930 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
13940 28 69 69 3e 3e 38 29 29 20 29 20 6e 44 65 66 61  (ii>>8)) ) nDefa
13950 75 6c 74 50 61 67 65 20 3d 20 69 69 3b 0a 20 20  ultPage = ii;.  
13960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13970 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
13980 20 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50     if( nDefaultP
13990 61 67 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  age>SQLITE_MAX_D
139a0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
139b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 44   ){.          nD
139c0 65 66 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c  efaultPage = SQL
139d0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
139e0 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
139f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13a00 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
13a10 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 2f 2a 20  memDb ){.    /* 
13a20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
13a30 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
13a40 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
13a50 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
13a60 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
13a70 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
13a80 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
13a90 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
13aa0 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
13ab0 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
13ac0 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
13ad0 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
13ae0 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65  ..    */ .    te
13af0 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
13b00 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
13b10 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
13b20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
13b30 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
13b40 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
13b50 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28  r->pTmpSpace = (
13b60 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
13b70 61 6c 6c 6f 63 28 6e 44 65 66 61 75 6c 74 50 61  alloc(nDefaultPa
13b80 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
13b90 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
13ba0 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
13bb0 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
13bc0 2e 0a 20 20 2a 2a 20 46 72 65 65 20 74 68 65 20  ..  ** Free the 
13bd0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
13be0 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
13bf0 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 74  le..  ** Since t
13c00 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
13c10 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20  allocated there 
13c20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65  is no need to se
13c30 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65  t .  ** any Page
13c40 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62  r.errMask variab
13c50 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
13c60 21 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61 67  !pPager || !pPag
13c70 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  er->pTmpSpace ){
13c80 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
13c90 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
13ca0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
13cb0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
13cc0 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49  eturn ((rc==SQLI
13cd0 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f  TE_OK)?SQLITE_NO
13ce0 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20  MEM:rc);.  }..  
13cf0 50 41 47 45 52 54 52 41 43 45 33 28 22 4f 50 45  PAGERTRACE3("OPE
13d00 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45  N %d %s\n", FILE
13d10 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d  HANDLEID(pPager-
13d20 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46  >fd), pPager->zF
13d30 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52  ilename);.  IOTR
13d40 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
13d50 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
13d60 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
13d70 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50  ..  /* Fill in P
13d80 61 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 5b  ager.zDirectory[
13d90 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50  ] */.  memcpy(pP
13da0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
13db0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
13dc0 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31  ame, nPathname+1
13dd0 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c 65  );.  for(i=strle
13de0 6e 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  n(pPager->zDirec
13df0 74 6f 72 79 29 3b 20 69 3e 30 20 26 26 20 70 50  tory); i>0 && pP
13e00 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
13e10 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29  [i-1]!='/'; i--)
13e20 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70  {}.  if( i>0 ) p
13e30 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
13e40 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f  y[i-1] = 0;..  /
13e50 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e  * Fill in Pager.
13e60 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 61 6e 64 20 50  zJournal[] and P
13e70 61 67 65 72 2e 7a 53 74 6d 74 4a 72 6e 6c 5b 5d  ager.zStmtJrnl[]
13e80 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61   */.  memcpy(pPa
13e90 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
13ea0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
13eb0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
13ec0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
13ed0 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
13ee0 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  me], "-journal",
13ef0 20 39 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50   9);.  memcpy(pP
13f00 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 2c  ager->zStmtJrnl,
13f10 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
13f20 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
13f30 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
13f40 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 5b 6e 50 61 74  ->zStmtJrnl[nPat
13f50 68 6e 61 6d 65 5d 2c 20 22 2d 73 74 6d 74 6a 72  hname], "-stmtjr
13f60 6e 6c 22 2c 20 31 30 29 3b 0a 0a 20 20 2f 2a 20  nl", 10);..  /* 
13f70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13f80 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  pen = 0; */.  pP
13f90 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
13fa0 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26   = useJournal &&
13fb0 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65   !memDb;.  pPage
13fc0 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  r->noReadlock = 
13fd0 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65  noReadlock && re
13fe0 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
13ff0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
14000 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
14010 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
14020 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
14030 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
14040 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
14050 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61  = memDb-1;.  pPa
14060 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
14070 6e 44 65 66 61 75 6c 74 50 61 67 65 3b 0a 20 20  nDefaultPage;.  
14080 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
14090 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
140a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
140b0 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
140c0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
140d0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
140e0 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20  mxPage = 100;.  
140f0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
14100 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
14110 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
14120 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
14130 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
14140 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14150 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69  state == (tempFi
14160 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55  le ? PAGER_EXCLU
14170 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c  SIVE : PAGER_UNL
14180 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61  OCK) );.  /* pPa
14190 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
141a0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
141b0 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69  empFile = tempFi
141c0 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
141d0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
141e0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
141f0 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
14200 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
14210 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
14220 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
14230 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
14240 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
14250 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
14260 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65  clusiveMode = te
14270 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
14280 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62  r->memDb = memDb
14290 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
142a0 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b  Only = readOnly;
142b0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65  .  /* pPager->ne
142c0 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20  edSync = 0; */. 
142d0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
142e0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
142f0 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61  le || !useJourna
14300 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  l;.  pPager->ful
14310 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d  lSync = (pPager-
14320 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20  >noSync?0:1);.  
14330 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
14340 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
14350 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50  _NORMAL;.  /* pP
14360 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
14370 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
14380 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
14390 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
143a0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
143b0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
143c0 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e  ra = FORCE_ALIGN
143d0 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20  MENT(nExtra);.  
143e0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
143f0 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 6d 65 6d  d->pMethods||mem
14400 44 62 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20  Db||tempFile);. 
14410 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20   if( !memDb ){. 
14420 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
14430 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
14440 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
14450 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
14460 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
14470 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
14480 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
14490 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61  sh)); */.  *ppPa
144a0 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69  ger = pPager;.#i
144b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
144c0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
144d0 4d 45 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 69  MENT.  pPager->i
144e0 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 70  InUseMM = 0;.  p
144f0 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 20  Pager->iInUseDB 
14500 3d 20 30 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44  = 0;.  if( !memD
14510 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
14520 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20  _mutex *mutex = 
14530 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
14540 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
14550 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20  _STATIC_MEM2);. 
14560 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14570 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20  _enter(mutex);. 
14580 20 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74     pPager->pNext
14590 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
145a0 69 73 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ist;.    if( sql
145b0 69 74 65 33 50 61 67 65 72 4c 69 73 74 20 29 7b  ite3PagerList ){
145c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
145d0 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d  qlite3PagerList-
145e0 3e 70 50 72 65 76 3d 3d 30 20 29 3b 0a 20 20 20  >pPrev==0 );.   
145f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c     sqlite3PagerL
14600 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 61  ist->pPrev = pPa
14610 67 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ger;.    }.    p
14620 50 61 67 65 72 2d 3e 70 50 72 65 76 20 3d 20 30  Pager->pPrev = 0
14630 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
14640 65 72 4c 69 73 74 20 3d 20 70 50 61 67 65 72 3b  erList = pPager;
14650 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
14660 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b  ex_leave(mutex);
14670 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
14680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14690 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
146a0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
146b0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
146c0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
146d0 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
146e0 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
146f0 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
14700 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
14710 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
14720 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
14730 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
14740 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
14750 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
14760 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
14770 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
14780 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
14790 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
147a0 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
147b0 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
147c0 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
147d0 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
147e0 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
147f0 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
14800 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
14810 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
14820 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
14830 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
14840 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
14850 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a  PagerClose().  .
14860 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
14870 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
14880 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  y sqlite3PagerUn
14890 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
148a0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 65  qlite3PagerSetDe
148b0 73 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a  structor(Pager *
148c0 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
148d0 44 65 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e  Desc)(DbPage*,in
148e0 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
148f0 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65  Destructor = xDe
14900 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  sc;.}../*.** Set
14910 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
14920 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
14930 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
14940 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
14950 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
14960 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
14970 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
14980 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
14990 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
149a0 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
149b0 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
149c0 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
149d0 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
149e0 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
149f0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
14a00 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
14a10 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
14a20 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
14a30 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
14a40 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14a50 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65  3PagerSetReinite
14a60 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
14a70 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
14a80 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a  (DbPage*,int)){.
14a90 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
14aa0 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
14ab0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
14ac0 70 61 67 65 20 73 69 7a 65 20 74 6f 20 2a 70 50  page size to *pP
14ad0 61 67 65 53 69 7a 65 2e 20 49 66 20 74 68 65 20  ageSize. If the 
14ae0 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65  suggest new page
14af0 20 73 69 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70   size is.** inap
14b00 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20  propriate, then 
14b10 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
14b20 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
14b30 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65  to that.** value
14b40 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
14b50 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
14b60 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
14b70 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
14b80 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29   u16 *pPageSize)
14b90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14ba0 49 54 45 5f 4f 4b 3b 0a 20 20 75 31 36 20 70 61  ITE_OK;.  u16 pa
14bb0 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
14bc0 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ize;.  assert( p
14bd0 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
14be0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
14bf0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
14c00 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
14c10 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
14c20 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70  e && pageSize!=p
14c30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
14c40 0a 20 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e  .   && !pPager->
14c50 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d  memDb && pPager-
14c60 3e 6e 52 65 66 3d 3d 30 20 0a 20 20 29 7b 0a 20  >nRef==0 .  ){. 
14c70 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
14c80 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
14c90 6d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  malloc(pageSize)
14ca0 3b 0a 20 20 20 20 69 66 28 20 21 70 4e 65 77 20  ;.    if( !pNew 
14cb0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
14cc0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
14cd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67  }else{.      pag
14ce0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
14cf0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
14d00 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
14d10 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
14d20 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
14d30 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69       setSectorSi
14d40 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
14d50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14d60 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
14d70 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
14d80 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
14d90 77 3b 0a 20 20 20 20 20 20 70 61 67 65 72 4c 65  w;.      pagerLe
14da0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
14db0 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 61 67 65 53   }.  }.  *pPageS
14dc0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
14dd0 67 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  geSize;.  return
14de0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
14df0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
14e00 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
14e10 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
14e20 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
14e30 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
14e40 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
14e50 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
14e60 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
14e70 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
14e80 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
14e90 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
14ea0 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
14eb0 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
14ec0 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
14ed0 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
14ee0 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
14ef0 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
14f00 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
14f10 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
14f20 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
14f30 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
14f40 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
14f50 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
14f60 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
14f70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
14f80 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
14f90 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
14fa0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
14fb0 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
14fc0 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
14fd0 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
14fe0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
14ff0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
15000 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
15010 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
15020 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
15030 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
15040 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
15050 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
15060 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
15070 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
15080 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
15090 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
150a0 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
150b0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
150c0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
150d0 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
150e0 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
150f0 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
15100 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
15110 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
15120 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ge;.  }.  sqlite
15130 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
15140 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
15150 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
15160 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
15170 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
15180 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
15190 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
151a0 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
151b0 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
151c0 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
151d0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
151e0 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
151f0 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
15200 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
15210 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
15220 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
15230 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
15240 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
15250 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
15260 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
15270 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
15280 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
15290 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
152a0 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
152b0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
152c0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
152d0 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
152e0 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
152f0 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
15300 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
15310 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
15320 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
15330 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
15340 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
15350 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
15360 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
15370 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
15380 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
15390 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
153a0 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
153b0 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
153c0 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
153d0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
153e0 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
153f0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
15400 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
15410 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
15420 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
15430 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
15440 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
15450 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
15460 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
15470 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65   to. .**.** No e
15480 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73  rror checking is
15490 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f   done. The ratio
154a0 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20  nal for this is 
154b0 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
154c0 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61  on .** may be ca
154d0 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  lled even if the
154e0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
154f0 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20  xist or contain 
15500 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a  a header. In .**
15510 20 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c   these cases sql
15520 69 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c  ite3OsRead() wil
15530 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  l return an erro
15540 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  r, to which the 
15550 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70  correct .** resp
15560 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20  onse is to zero 
15570 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44  the memory at pD
15580 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65  est and continue
15590 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72  .  A real IO err
155a0 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73  or .** will pres
155b0 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64  umably recur and
155c0 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61   be picked up la
155d0 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b  ter (Todo: Think
155e0 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f   about this)..*/
155f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
15600 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
15610 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
15620 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
15630 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
15640 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15650 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
15660 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
15670 72 74 28 4d 45 4d 44 42 7c 7c 70 50 61 67 65 72  rt(MEMDB||pPager
15680 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
15690 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
156a0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
156b0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
156c0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
156d0 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
156e0 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
156f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
15700 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
15710 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20  pDest, N, 0);.  
15720 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15730 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
15740 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
15750 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
15760 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15780 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
15790 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
157a0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73  he disk file ass
157b0 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
157c0 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49  pPager. .**.** I
157d0 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59  f the PENDING_BY
157e0 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70  TE lies on the p
157f0 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74  age directly aft
15800 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  er the end of th
15810 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  e.** file, then 
15820 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61  consider this pa
15830 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  ge part of the f
15840 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61  ile too. For exa
15850 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44  mple, if.** PEND
15860 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65  ING_BYTE is byte
15870 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74   4096 (the first
15880 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29   byte of page 5)
15890 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
158a0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
158b0 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73  4096 bytes, 5 is
158c0 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
158d0 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73  d of 4..*/.int s
158e0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
158f0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
15900 65 72 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30  er){.  i64 n = 0
15910 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
15920 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
15930 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
15940 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
15950 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
15960 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
15970 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20  ize>=0 ){.    n 
15980 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
15990 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
159a0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
159b0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
159c0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
159d0 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72  .    if( (pPager
159e0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  ->fd->pMethods).
159f0 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71       && (rc = sq
15a00 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
15a10 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29  pPager->fd, &n))
15a20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15a30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
15a40 66 2b 2b 3b 0a 20 20 20 20 20 20 70 61 67 65 72  f++;.      pager
15a50 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
15a60 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  c);.      pPager
15a70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20  ->nRef--;.      
15a80 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
15a90 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
15aa0 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
15ab0 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  ze ){.      n = 
15ac0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
15ad0 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d      n /= pPager-
15ae0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
15af0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
15b00 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
15b10 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
15b20 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
15b30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
15b40 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59  ( n==(PENDING_BY
15b50 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
15b60 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  ize) ){.    n++;
15b70 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61  .  }.  if( n>pPa
15b80 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
15b90 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
15ba0 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  o = n;.  }.  ret
15bb0 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  urn n;.}...#ifnd
15bc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
15bd0 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c  EMORYDB./*.** Cl
15be0 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
15bf0 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
15c00 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
15c10 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
15c20 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  st){.  sqlite3_f
15c30 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  ree(pHist->pOrig
15c40 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
15c50 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
15c60 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  .  pHist->pOrig 
15c70 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53  = 0;.  pHist->pS
15c80 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  tmt = 0;.}.#else
15c90 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69  .#define clearHi
15ca0 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a  story(x).#endif.
15cb0 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
15cc0 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
15cd0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
15ce0 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f  rnal(Pager*);../
15cf0 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20  *.** Unlink pPg 
15d00 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68  from its hash ch
15d10 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68  ain. Also set th
15d20 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  e page number to
15d30 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a   0 to indicate.*
15d40 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
15d50 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
15d60 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54  ny hash chain. T
15d70 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
15d80 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73  because the.** s
15d90 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
15da0 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61  age() routine ca
15db0 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69  n leave a page i
15dc0 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46  n the .** pNextF
15dd0 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69  ree/pPrevFree li
15de0 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  st that is not a
15df0 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73   part of any has
15e00 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  h-chain..*/.stat
15e10 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61  ic void unlinkHa
15e20 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70  shChain(Pager *p
15e30 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
15e40 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  g){.  if( pPg->p
15e50 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  gno==0 ){.    as
15e60 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
15e70 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Hash==0 && pPg->
15e80 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
15e90 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
15ea0 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
15eb0 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d  Hash ){.    pPg-
15ec0 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
15ed0 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  vHash = pPg->pPr
15ee0 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66  evHash;.  }.  if
15ef0 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  ( pPg->pPrevHash
15f00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15f10 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50  pPager->aHash[pP
15f20 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65  g->pgno & (pPage
15f30 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50  r->nHash-1)]!=pP
15f40 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
15f50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61  revHash->pNextHa
15f60 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  sh = pPg->pNextH
15f70 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ash;.  }else{.  
15f80 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70    int h = pPg->p
15f90 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
15fa0 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 61  Hash-1);.    pPa
15fb0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
15fc0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
15fd0 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20    }.  if( MEMDB 
15fe0 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73 74  ){.    clearHist
15ff0 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
16000 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
16010 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f  .  }.  pPg->pgno
16020 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65   = 0;.  pPg->pNe
16030 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  xtHash = pPg->pP
16040 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a  revHash = 0;.}..
16050 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70  /*.** Unlink a p
16060 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
16070 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74  e list (the list
16080 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68   of all pages wh
16090 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20  ere nRef==0).** 
160a0 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73  and from its has
160b0 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
160c0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
160d0 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48  d unlinkPage(PgH
160e0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
160f0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
16100 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 55  >pPager;..  /* U
16110 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66 72 65 65 20  nlink from free 
16120 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 6c  page list */.  l
16130 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67  ruListRemove(pPg
16140 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  );..  /* Unlink 
16150 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61  from the pgno ha
16160 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e  sh table */.  un
16170 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
16180 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f  ager, pPg);.}../
16190 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
161a0 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
161b0 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65 20  ncate the cache 
161c0 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 0a  when a database.
161d0 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65 64 2e  ** is truncated.
161e0 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68 65 20    Drop from the 
161f0 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65 73 20  cache all pages 
16200 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a  whose pgno is.**
16210 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
16220 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20  ger->dbSize and 
16230 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e  is unreferenced.
16240 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
16250 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74  d pages larger t
16260 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
16270 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ze are zeroed..*
16280 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61  *.** Actually, a
16290 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73  t the point this
162a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
162b0 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62 65 0a  ed, it would be.
162c0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 68  ** an error to h
162d0 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65 64  ave a referenced
162e0 20 70 61 67 65 2e 20 20 42 75 74 20 72 61 74 68   page.  But rath
162f0 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a  er than delete.*
16300 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e 64 20  * that page and 
16310 67 75 61 72 61 6e 74 65 65 20 61 20 73 75 62 73  guarantee a subs
16320 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c 74 2c  equent segfault,
16330 20 69 74 20 73 65 65 6d 73 20 62 65 74 74 65 72   it seems better
16340 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20 61  .** to zero it a
16350 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77 65 20  nd hope that we 
16360 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79  error out sanely
16370 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16380 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
16390 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
163a0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
163b0 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70  Pg;.  PgHdr **pp
163c0 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  Pg;.  int dbSize
163d0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
163e0 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50  e;..  ppPg = &pP
163f0 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68  ager->pAll;.  wh
16400 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50  ile( (pPg = *ppP
16410 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  g)!=0 ){.    if(
16420 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69   pPg->pgno<=dbSi
16430 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67  ze ){.      ppPg
16440 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
16450 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
16460 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a   pPg->nRef>0 ){.
16470 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
16480 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
16490 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
164a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50  Size);.      ppP
164b0 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
164c0 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
164d0 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67       *ppPg = pPg
164e0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
164f0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46 52    IOTRACE(("PGFR
16500 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  EE %p %d\n", pPa
16510 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
16520 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
16530 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
16540 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a  _pgfree_count);.
16550 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65        unlinkPage
16560 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b  (pPg);.      mak
16570 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
16580 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16590 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  pPg->pData);.   
165a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
165b0 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pPg);.      pPag
165c0 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20  er->nPage--;.   
165d0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
165e0 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
165f0 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20  lock on a file. 
16600 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
16610 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
16620 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72   lock.** is curr
16630 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
16640 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74  ble.  Repeat unt
16650 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
16660 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20  back returns.** 
16670 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
16680 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
16690 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
166a0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
166b0 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
166c0 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
166d0 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
166e0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
166f0 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
16700 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
16710 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
16720 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ype){.  int rc;.
16730 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63  .  /* The OS loc
16740 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  k values must be
16750 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
16760 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75   Pager lock valu
16770 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
16780 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48  PAGER_SHARED==SH
16790 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
167a0 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53  ssert( PAGER_RES
167b0 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f  ERVED==RESERVED_
167c0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
167d0 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ( PAGER_EXCLUSIV
167e0 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  E==EXCLUSIVE_LOC
167f0 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
16800 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e  e file is curren
16810 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65  tly unlocked the
16820 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20  n the size must 
16830 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20  be unknown */.  
16840 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16850 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
16860 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  RED || pPager->d
16870 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42  bSize<0 || MEMDB
16880 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
16890 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
168a0 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
168b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
168c0 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
168d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
168e0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
168f0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
16900 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
16910 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74  TE_BUSY && sqlit
16920 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
16930 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
16940 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20  yHandler) );.   
16950 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16960 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
16970 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b  er->state = lock
16980 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52  type;.      IOTR
16990 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64  ACE(("LOCK %p %d
169a0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63  \n", pPager, loc
169b0 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20  ktype)).    }.  
169c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
169d0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
169e0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65   the file to the
169f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
16a00 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69   specified..*/.i
16a10 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  nt sqlite3PagerT
16a20 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
16a30 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
16a40 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
16a50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16a60 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
16a70 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a  RED || MEMDB );.
16a80 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
16a90 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
16aa0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
16ab0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
16ac0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
16ad0 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  de;.    return r
16ae0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  c;.  }.  if( nPa
16af0 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50  ge>=(unsigned)pP
16b00 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
16b10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16b20 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
16b30 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
16b40 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
16b50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74  age;.    pager_t
16b60 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
16b70 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
16b80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16b90 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
16ba0 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 79  ager);.  rc = sy
16bb0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
16bc0 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
16bd0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
16be0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16bf0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16c00 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20   }..  /* Get an 
16c10 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
16c20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
16c30 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
16c40 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45 6e 74 65  . */.  pagerEnte
16c50 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  r(pPager);.  rc 
16c60 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
16c70 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
16c80 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
16c90 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
16ca0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
16cb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16cc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
16cd0 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
16ce0 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61  cate(pPager, nPa
16cf0 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
16d00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
16d10 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
16d20 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
16d30 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
16d40 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
16d50 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
16d60 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
16d70 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
16d80 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
16d90 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
16da0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
16db0 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
16dc0 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
16dd0 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
16de0 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
16df0 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
16e00 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
16e10 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
16e20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
16e30 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
16e40 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
16e50 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
16e60 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
16e70 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
16e80 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
16e90 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
16ea0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
16eb0 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
16ec0 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
16ed0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
16ee0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
16ef0 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
16f00 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
16f10 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
16f20 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
16f30 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
16f40 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
16f50 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
16f60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
16f70 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
16f80 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20 53  Pager){.#ifdef S
16f90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
16fa0 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
16fb0 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
16fc0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
16fd0 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65   *mutex = sqlite
16fe0 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
16ff0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
17000 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 73 71 6c  C_MEM2);.    sql
17010 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
17020 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 69 66 28  (mutex);.    if(
17030 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 20 29   pPager->pPrev )
17040 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
17050 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
17060 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Pager->pNext;.  
17070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
17080 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20  qlite3PagerList 
17090 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
170a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
170b0 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 29 7b 0a  Pager->pNext ){.
170c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4e        pPager->pN
170d0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 61  ext->pPrev = pPa
170e0 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ger->pPrev;.    
170f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  }.    sqlite3_mu
17100 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29  tex_leave(mutex)
17110 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
17120 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
17130 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
17140 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17150 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
17160 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
17170 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
17180 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
17190 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
171a0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e  ck(pPager);.  en
171b0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
171c0 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
171d0 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45  GERTRACE2("CLOSE
171e0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
171f0 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52  pPager));.  IOTR
17200 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
17210 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 61 73  ", pPager)).  as
17220 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
17230 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72  rCode || (pPager
17240 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
17250 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   && pPager->stmt
17260 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66  Open==0) );.  if
17270 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
17280 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
17290 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
172a0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  er->jfd);.  }.  
172b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
172c0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
172d0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
172e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
172f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
17300 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
17310 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  tfd);.  }.  sqli
17320 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
17330 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d  r->fd);.  /* Tem
17340 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
17350 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
17360 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
17370 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
17380 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
17390 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
173a0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
173b0 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
173c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
173d0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
173e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
173f0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
17400 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
17410 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
17420 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17430 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
17440 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
17450 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
17460 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17470 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
17480 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
17490 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
174a0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
174b0 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a  ber(DbPage *p){.
174c0 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
174d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
174e0 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29  * The page_ref()
174f0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d   function increm
17500 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  ents the referen
17510 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
17520 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70  age..** If the p
17530 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
17540 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
17550 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
17560 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
17570 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
17580 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
17590 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  st..**.** For no
175a0 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  n-test systems, 
175b0 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20  page_ref() is a 
175c0 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73  macro that calls
175d0 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20   _page_ref().** 
175e0 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  online of the re
175f0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
17600 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74   zero.  For test
17610 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
17620 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61  ef().** is a rea
17630 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68  l function so th
17640 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72  at we can set br
17650 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72  eakpoints and tr
17660 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ace it..*/.stati
17670 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
17680 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
17690 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
176a0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
176b0 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
176c0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
176d0 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
176e0 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f  .    lruListRemo
176f0 76 65 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  ve(pPg);.    pPg
17700 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b  ->pPager->nRef++
17710 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65  ;.  }.  pPg->nRe
17720 66 2b 2b 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  f++;.}.#ifdef SQ
17730 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61  LITE_DEBUG.  sta
17740 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
17750 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
17760 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
17770 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61  ==0 ){.      _pa
17780 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20  ge_ref(pPg);.   
17790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
177a0 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d  g->nRef++;.    }
177b0 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
177c0 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
177d0 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
177e0 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
177f0 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
17800 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
17810 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
17820 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
17830 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
17840 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
17850 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
17860 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
17870 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
17880 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
17890 67 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  g){.  pagerEnter
178a0 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pPg->pPager);. 
178b0 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
178c0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 67    pagerLeave(pPg
178d0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  ->pPager);.  ret
178e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
178f0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
17900 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
17910 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
17920 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
17930 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
17940 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
17950 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
17960 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
17970 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
17980 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
17990 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
179a0 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
179b0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
179c0 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
179d0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
179e0 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
179f0 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
17a00 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
17a10 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
17a20 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
17a30 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
17a40 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
17a50 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
17a60 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
17a70 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
17a80 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
17a90 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
17aa0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
17ab0 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
17ac0 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
17ad0 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
17ae0 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
17af0 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
17b00 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
17b10 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
17b20 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
17b30 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
17b40 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
17b50 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
17b60 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
17b70 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
17b80 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
17b90 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
17ba0 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
17bb0 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
17bc0 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
17bd0 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
17be0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
17bf0 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
17c00 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
17c10 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
17c20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
17c30 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
17c40 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
17c50 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
17c60 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
17c70 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73  failure, so no s
17c80 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
17c90 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  * If the IOCAP_S
17ca0 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69  EQUENTIAL flag i
17cb0 73 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65  s set for the pe
17cc0 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f  rsistent media o
17cd0 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64  n which.** the d
17ce0 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65  atabase is store
17cf0 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29  d, then OsSync()
17d00 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
17d10 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   on the journal.
17d20 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  ** file. In this
17d30 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69   case all that i
17d40 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f  s required is to
17d50 20 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63   update the nRec
17d60 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65   field in.** the
17d70 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
17d80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
17d90 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
17da0 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
17db0 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
17dc0 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
17dd0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
17de0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
17df0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
17e00 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
17e10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17e20 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79 6e 63  _OK;...  /* Sync
17e30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
17e40 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
17e50 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
17e60 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
17e70 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
17e80 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
17e90 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
17ea0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
17eb0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
17ec0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
17ed0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
17ee0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
17ef0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
17f00 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
17f10 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
17f20 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
17f30 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
17f40 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
17f50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
17f60 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
17f70 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
17f80 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
17f90 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
17fa0 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
17fb0 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
17fc0 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
17fd0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
17fe0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
17ff0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
18000 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
18010 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
18020 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
18030 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
18040 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
18050 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
18060 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
18070 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
18080 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20      i64 jSz;.   
18090 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
180a0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
180b0 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a  er->jfd, &jSz);.
180c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
180d0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
180e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
180f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
18100 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20  f==jSz );.      
18110 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
18120 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
18130 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
18140 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
18150 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
18160 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
18170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
18180 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
18190 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
181a0 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
181b0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
181c0 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
181d0 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
181e0 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
181f0 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
18200 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
18210 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
18220 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
18230 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
18240 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
18250 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
18260 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
18270 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
18280 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
18290 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
182a0 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
182b0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
182c0 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
182d0 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
182e0 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
182f0 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
18300 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
18310 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
18320 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
18330 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
18340 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
18350 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
18360 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
18370 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
18380 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
18390 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
183a0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
183b0 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f         i64 jrnlO
183c0 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ff;.        if( 
183d0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
183e0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
183f0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
18400 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
18410 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
18420 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
18430 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
18440 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
18450 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
18460 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
18470 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
18480 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
18490 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
184a0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
184b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
184c0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
184d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
184e0 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70       jrnlOff = p
184f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
18500 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
18510 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
18520 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
18530 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
18540 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66   pPager, jrnlOff
18550 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72  , 4));.        r
18560 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
18570 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
18580 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52  lOff, pPager->nR
18590 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
185a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
185b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
185c0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
185d0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
185e0 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
185f0 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
18600 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
18610 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
18620 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  r));.        IOT
18630 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
18640 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
18650 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18660 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
18670 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
18680 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
18690 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
186a0 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
186b0 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
186c0 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
186d0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
186e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
186f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18700 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
18710 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
18720 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
18730 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
18740 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
18750 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
18760 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
18770 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
18780 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
18790 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
187a0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
187b0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
187c0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
187d0 20 20 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69      lruListSetFi
187e0 72 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72  rstSynced(pPager
187f0 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
18800 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
18810 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
18820 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  c flag is clear 
18830 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e  then the PgHdr.n
18840 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  eedSync.  ** fla
18850 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63  g must also be c
18860 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67  lear for all pag
18870 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  es.  Verify that
18880 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72   this.  ** invar
18890 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20  iant is true..  
188a0 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66  */.  else{.    f
188b0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
188c0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
188d0 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
188e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
188f0 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
18900 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
18910 28 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  ( pPager->lru.pF
18920 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67  irstSynced==pPag
18930 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29  er->lru.pFirst )
18940 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
18950 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18960 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69  .** Merge two li
18970 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e  sts of pages con
18980 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
18990 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64   and in pgno ord
189a0 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f  er..** Do not bo
189b0 74 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50  th fixing the pP
189c0 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72  revDirty pointer
189d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  s..*/.static PgH
189e0 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69  dr *merge_pageli
189f0 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67  st(PgHdr *pA, Pg
18a00 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64  Hdr *pB){.  PgHd
18a10 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c  r result, *pTail
18a20 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73  ;.  pTail = &res
18a30 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41  ult;.  while( pA
18a40 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66   && pB ){.    if
18a50 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70  ( pA->pgno<pB->p
18a60 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61  gno ){.      pTa
18a70 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b  il->pDirty = pA;
18a80 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70  .      pTail = p
18a90 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41  A;.      pA = pA
18aa0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65  ->pDirty;.    }e
18ab0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c  lse{.      pTail
18ac0 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
18ad0 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b       pTail = pB;
18ae0 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e  .      pB = pB->
18af0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
18b00 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20  }.  if( pA ){.  
18b10 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
18b20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = pA;.  }else if
18b30 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69  ( pB ){.    pTai
18b40 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a  l->pDirty = pB;.
18b50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
18b60 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  il->pDirty = 0;.
18b70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
18b80 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f  ult.pDirty;.}../
18b90 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69  *.** Sort the li
18ba0 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  st of pages in a
18bb0 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  ccending order b
18bc0 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61  y pgno.  Pages a
18bd0 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  re.** connected 
18be0 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65  by pDirty pointe
18bf0 72 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69  rs.  The pPrevDi
18c00 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65  rty pointers are
18c10 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79  .** corrupted by
18c20 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23   this sort..*/.#
18c30 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
18c40 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64  CKET_ALLOC 25.#d
18c50 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
18c60 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23 69 66  KET       25.#if
18c70 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
18c80 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61    int sqlite3_pa
18c90 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
18ca0 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20  t = 0;.  #undef 
18cb0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20  N_SORT_BUCKET.  
18cc0 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
18cd0 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69  UCKET \.   (sqli
18ce0 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74  te3_pager_n_sort
18cf0 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f  _bucket?sqlite3_
18d00 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
18d10 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ket:N_SORT_BUCKE
18d20 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a  T_ALLOC).#endif.
18d30 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f  static PgHdr *so
18d40 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  rt_pagelist(PgHd
18d50 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72  r *pIn){.  PgHdr
18d60 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45   *a[N_SORT_BUCKE
18d70 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20  T_ALLOC], *p;.  
18d80 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28  int i;.  memset(
18d90 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29  a, 0, sizeof(a))
18da0 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29  ;.  while( pIn )
18db0 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20  {.    p = pIn;. 
18dc0 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72     pIn = p->pDir
18dd0 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74  ty;.    p->pDirt
18de0 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  y = 0;.    for(i
18df0 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43  =0; i<N_SORT_BUC
18e00 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  KET-1; i++){.   
18e10 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29     if( a[i]==0 )
18e20 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d  {.        a[i] =
18e30 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   p;.        brea
18e40 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
18e50 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67          p = merg
18e60 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c  e_pagelist(a[i],
18e70 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69   p);.        a[i
18e80 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
18e90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
18ea0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20  N_SORT_BUCKET-1 
18eb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65  ){.      /* Cove
18ec0 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72  rage: To get her
18ed0 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f  e, there need to
18ee0 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55   be 2^(N_SORT_BU
18ef0 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20  CKET) .      ** 
18f00 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
18f10 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73  input list. This
18f20 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75   is possible, bu
18f30 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20  t impractical.. 
18f40 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20       ** Testing 
18f50 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65  this line is the
18f60 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c   point of global
18f70 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20   variable.      
18f80 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  ** sqlite3_pager
18f90 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a  _n_sort_bucket..
18fa0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
18fb0 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65  [i] = merge_page
18fc0 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
18fd0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61     }.  }.  p = a
18fe0 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  [0];.  for(i=1; 
18ff0 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b  i<N_SORT_BUCKET;
19000 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d   i++){.    p = m
19010 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c  erge_pagelist(p,
19020 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65   a[i]);.  }.  re
19030 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
19040 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66   Given a list of
19050 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65   pages (connecte
19060 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  d by the PgHdr.p
19070 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77  Dirty pointer) w
19080 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e  rite.** every on
19090 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
190a0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
190b0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61  base file and ma
190c0 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61  rk them all.** a
190d0 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74  s clean..*/.stat
190e0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
190f0 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
19100 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
19110 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 50 67  er *pPager;.  Pg
19120 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  Hdr *p;.  int rc
19130 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ;..  if( pList==
19140 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
19150 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
19160 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
19170 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
19180 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
19190 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
191a0 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
191b0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
191c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
191d0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
191e0 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
191f0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
19200 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20  wing.  ** calls 
19210 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  to sqlite3OsLock
19220 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20  () are no-ops.. 
19230 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
19240 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
19250 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
19260 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
19270 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
19280 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
19290 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
192a0 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
192b0 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
192c0 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
192d0 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
192e0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
192f0 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
19300 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
19310 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
19320 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
19330 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
19340 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
19350 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
19360 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
19370 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
19380 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
19390 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
193a0 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
193b0 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
193c0 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
193d0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
193e0 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
193f0 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
19400 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
19410 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
19420 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
19430 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
19440 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
19450 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
19460 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
19470 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
19480 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
19490 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
194a0 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
194b0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
194c0 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
194d0 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
194e0 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
194f0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
19500 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
19510 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
19520 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19530 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
19540 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74  ..  pList = sort
19550 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29  _pagelist(pList)
19560 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
19570 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
19580 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
19590 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 70 2d  >dirty );.    p-
195a0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  >dirty = 0;.  }.
195b0 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
195c0 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  {..    /* If the
195d0 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
195e0 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
195f0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
19600 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
19610 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
19620 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
19630 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
19640 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19650 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
19660 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
19670 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
19680 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  ->zFilename,.   
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
196b0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
196c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
196d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
196e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
196f0 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
19700 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
19710 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
19720 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
19730 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
19740 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
19750 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
19760 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
19770 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
19780 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
19790 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
197a0 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
197b0 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
197c0 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
197d0 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
197e0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
197f0 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
19800 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
19810 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
19820 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70  fset = (pList->p
19830 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
19840 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
19850 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
19860 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
19870 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
19880 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
19890 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41  no, 6);.      PA
198a0 47 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45  GERTRACE4("STORE
198b0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
198c0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
198d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
198e0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
198f0 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65  List->pgno, page
19900 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
19910 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
19920 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
19930 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73  n", pPager, pLis
19940 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  t->pgno));.     
19950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
19960 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
19970 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
19980 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
19990 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
199a0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
199b0 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
199c0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
199d0 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
199e0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
199f0 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  ist->pgno==1 ){.
19a00 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
19a10 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
19a20 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
19a30 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
19a40 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
19a50 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
19a60 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
19a70 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
19a80 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
19a90 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
19aa0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
19ab0 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
19ac0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
19ad0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
19ae0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
19af0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
19b00 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
19b10 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
19b20 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
19b30 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
19b40 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
19b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19b60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
19b70 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
19b80 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
19b90 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
19ba0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
19bb0 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
19bc0 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
19bd0 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
19be0 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
19bf0 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
19c00 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
19c10 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
19c20 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
19c30 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
19c40 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
19c50 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 73   /* Verify the s
19c60 61 6e 69 74 79 20 6f 66 20 74 68 65 20 64 69 72  anity of the dir
19c70 74 79 20 6c 69 73 74 20 77 68 65 6e 20 77 65 20  ty list when we 
19c80 61 72 65 20 72 75 6e 6e 69 6e 67 0a 20 20 2a 2a  are running.  **
19c90 20 69 6e 20 64 65 62 75 67 67 69 6e 67 20 6d 6f   in debugging mo
19ca0 64 65 2e 20 20 54 68 69 73 20 69 73 20 65 78 70  de.  This is exp
19cb0 65 6e 73 69 76 65 2c 20 73 6f 20 64 6f 20 6e 6f  ensive, so do no
19cc0 74 0a 20 20 2a 2a 20 64 6f 20 74 68 69 73 20 6f  t.  ** do this o
19cd0 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  n a normal build
19ce0 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 20 3d 20  . */.  int n1 = 
19cf0 30 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 30 3b  0;.  int n2 = 0;
19d00 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 66  .  PgHdr *p;.  f
19d10 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
19d20 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
19d30 41 6c 6c 29 7b 20 69 66 28 20 70 2d 3e 64 69 72  All){ if( p->dir
19d40 74 79 20 29 20 6e 31 2b 2b 3b 20 7d 0a 20 20 66  ty ) n1++; }.  f
19d50 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 44 69  or(p=pPager->pDi
19d60 72 74 79 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  rty; p; p=p->pDi
19d70 72 74 79 29 7b 20 6e 32 2b 2b 3b 20 7d 0a 20 20  rty){ n2++; }.  
19d80 61 73 73 65 72 74 28 20 6e 31 3d 3d 6e 32 20 29  assert( n1==n2 )
19d90 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  ;.#endif..  retu
19da0 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74  rn pPager->pDirt
19db0 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
19dc0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 72 65  rn TRUE if there
19dd0 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
19de0 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  l on the given p
19df0 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a  ager..** A hot j
19e00 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
19e10 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  at needs to be p
19e20 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  layed back..**.*
19e30 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
19e40 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
19e50 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
19e60 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
19e70 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
19e80 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
19e90 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
19ea0 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
19eb0 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
19ec0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
19ed0 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74  ame.  Just delet
19ee0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
19ef0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
19f00 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
19f10 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
19f20 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
19f30 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
19f40 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73   if( !pPager->us
19f50 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72  eJournal ) retur
19f60 6e 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  n 0;.  if( !pPag
19f70 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
19f80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
19f90 66 28 20 21 73 71 6c 69 74 65 33 4f 73 41 63 63  f( !sqlite3OsAcc
19fa0 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
19fb0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
19fc0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
19fd0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
19fe0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
19ff0 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
1a000 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
1a010 66 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  fd) ){.    retur
1a020 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 0;.  }.  if( s
1a030 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1a040 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20  ount(pPager)==0 
1a050 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
1a060 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
1a070 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
1a080 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1a090 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1a0a0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 1;.  }.}../
1a0b0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64  *.** Try to find
1a0c0 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 63   a page in the c
1a0d0 61 63 68 65 20 74 68 61 74 20 63 61 6e 20 62 65  ache that can be
1a0e0 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a   recycled. .**.*
1a0f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
1a100 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1a110 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46  _IOERR, SQLITE_F
1a120 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b  ULL or SQLITE_OK
1a130 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  . It .** does no
1a140 74 20 73 65 74 20 74 68 65 20 70 50 61 67 65 72  t set the pPager
1a150 2d 3e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  ->errCode variab
1a160 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1a170 74 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  t pager_recycle(
1a180 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1a190 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20  gHdr **ppPg){.  
1a1a0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70  PgHdr *pPg;.  *p
1a1b0 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  pPg = 0;..  /* I
1a1c0 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
1a1d0 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
1a1e0 6f 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 70 61  on unless the pa
1a1f0 67 65 72 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20  ger object.  ** 
1a200 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 50  pointed to by pP
1a210 61 67 65 72 20 68 61 73 20 61 74 20 6c 65 61 73  ager has at leas
1a220 74 20 6f 6e 65 20 66 72 65 65 20 70 61 67 65 20  t one free page 
1a230 28 70 61 67 65 20 77 69 74 68 20 6e 52 65 66 3d  (page with nRef=
1a240 3d 30 29 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  =0)..  */ .  ass
1a250 65 72 74 28 21 4d 45 4d 44 42 29 3b 0a 20 20 61  ert(!MEMDB);.  a
1a260 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72  ssert(pPager->lr
1a270 75 2e 70 46 69 72 73 74 29 3b 0a 0a 20 20 2f 2a  u.pFirst);..  /*
1a280 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20   Find a page to 
1a290 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f  recycle.  Try to
1a2a0 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74   locate a page t
1a2b0 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a  hat does not.  *
1a2c0 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20  * require us to 
1a2d0 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e  do an fsync() on
1a2e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20   the journal..  
1a2f0 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65  */.  pPg = pPage
1a300 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e  r->lru.pFirstSyn
1a310 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ced;..  /* If we
1a320 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
1a330 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
1a340 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20   not require an 
1a350 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20  fsync().  ** on 
1a360 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a370 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20   then fsync the 
1a380 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
1a390 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65  his is a.  ** ve
1a3a0 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
1a3b0 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
1a3c0 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
1a3d0 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
1a3e0 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20   ** it can't be 
1a3f0 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  helped..  */.  i
1a400 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61  f( pPg==0 && pPa
1a410 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29  ger->lru.pFirst)
1a420 7b 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  {.    int iDc = 
1a430 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
1a440 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
1a450 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
1a460 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  int rc = syncJou
1a470 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1a480 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1a490 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a4a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
1a4b0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1a4c0 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
1a4d0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1a4e0 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ND) ){.      /* 
1a4f0 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
1a500 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65  mode, write a ne
1a510 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  w journal header
1a520 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
1a530 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
1a540 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f   This is done to
1a550 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69   avoid ever modi
1a560 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a  fying a journal.
1a570 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20        ** header 
1a580 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64  that is involved
1a590 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
1a5a0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
1a5b0 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72  ave.      ** alr
1a5c0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1a5d0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
1a5e0 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68  e (in case the h
1a5f0 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a  eader is.      *
1a600 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74  * trashed when t
1a610 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
1a620 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20   updated)..     
1a630 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
1a640 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
1a650 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a660 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30  ->journalOff > 0
1a670 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1a680 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
1a690 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ync==0 );.      
1a6a0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
1a6b0 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
1a6c0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
1a6d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1a6e0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1a6f0 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61 67  }.    pPg = pPag
1a700 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a  er->lru.pFirst;.
1a710 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
1a720 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
1a730 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
1a740 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
1a750 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69  ase file if it i
1a760 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20  s dirty..  */.  
1a770 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
1a780 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1a790 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1a7a0 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
1a7b0 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
1a7c0 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
1a7d0 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 1;.    pPg->p
1a7e0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72  Dirty = 0;.    r
1a7f0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
1a800 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b  pagelist( pPg );
1a810 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
1a820 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 21  = 0;.    if( rc!
1a830 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a840 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a850 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
1a860 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30  t( pPg->dirty==0
1a870 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1a880 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63   page we are rec
1a890 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64  ycling is marked
1a8a0 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   as alwaysRollba
1a8b0 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65  ck, then.  ** se
1a8c0 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77  t the global alw
1a8d0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
1a8e0 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67  , thus disabling
1a8f0 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
1a900 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1a910 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ck() optimizatio
1a920 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f  n for the rest o
1a930 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1a940 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e  on..  ** It is n
1a950 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74  ecessary to do t
1a960 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20  his because the 
1a970 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61  page marked alwa
1a980 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  ysRollback.  ** 
1a990 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65  might be reloade
1a9a0 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d  d at a later tim
1a9b0 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f  e but at that po
1a9c0 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d  int we won't rem
1a9d0 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  ember.  ** that 
1a9e0 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c  is was marked al
1a9f0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54  waysRollback.  T
1aa00 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61  his means that a
1aa10 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20  ll pages must.  
1aa20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
1aa30 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
1aa40 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e  rom here on out.
1aa50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
1aa60 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1aa70 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
1aa80 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b  "ALWAYS_ROLLBACK
1aa90 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1aaa0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77  .    pPager->alw
1aab0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
1aac0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
1aad0 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66  k the old page f
1aae0 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
1aaf0 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74  t and the hash t
1ab00 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69  able.  */.  unli
1ab10 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 61  nkPage(pPg);.  a
1ab20 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
1ab30 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67 20  ==0 );..  *ppPg 
1ab40 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20  = pPg;.  return 
1ab50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1ab60 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1ab70 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
1ab80 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  MENT./*.** This 
1ab90 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1aba0 65 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72  ed to free super
1abb0 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c  fluous dynamical
1abc0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  ly allocated mem
1abd0 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74  ory.** held by t
1abe0 68 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e  he pager system.
1abf0 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   Memory in use b
1ac00 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67  y any SQLite pag
1ac10 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  er allocated.** 
1ac20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  by the current t
1ac30 68 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c  hread may be sql
1ac40 69 74 65 33 5f 66 72 65 65 28 29 65 64 2e 0a 2a  ite3_free()ed..*
1ac50 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65  *.** nReq is the
1ac60 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1ac70 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69   of memory requi
1ac80 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d  red. Once this m
1ac90 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  uch has.** been 
1aca0 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75  released, the fu
1acb0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
1acc0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1acd0 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
1ace0 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65  mber .** of byte
1acf0 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65  s of memory rele
1ad00 61 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ased..*/.int sql
1ad10 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73 65  ite3PagerRelease
1ad20 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29  Memory(int nReq)
1ad30 7b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65  {.  int nRelease
1ad40 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
1ad50 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f  /* Bytes of memo
1ad60 72 79 20 72 65 6c 65 61 73 65 64 20 73 6f 20 66  ry released so f
1ad70 61 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ar */.  sqlite3_
1ad80 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
1ad90 20 20 20 20 2f 2a 20 54 68 65 20 4d 45 4d 32 20      /* The MEM2 
1ada0 6d 75 74 65 78 20 2a 2f 0a 20 20 50 61 67 65 72  mutex */.  Pager
1adb0 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20   *pPager;       
1adc0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1add0 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 72  oping over pager
1ade0 73 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c  s */.  BusyHandl
1adf0 65 72 20 2a 73 61 76 65 64 42 75 73 79 3b 20 20  er *savedBusy;  
1ae00 20 20 20 2f 2a 20 53 61 76 65 64 20 63 6f 70 79     /* Saved copy
1ae10 20 6f 66 20 74 68 65 20 62 75 73 79 20 68 61 6e   of the busy han
1ae20 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  dler */.  int rc
1ae30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1ae40 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20   /* Acquire the 
1ae50 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e  memory-managemen
1ae60 74 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20 6d  t mutex.  */.  m
1ae70 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
1ae80 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1ae90 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
1aea0 45 4d 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  EM2);.  sqlite3_
1aeb0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
1aec0 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e 61 6c  x);..  /* Signal
1aed0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f   all database co
1aee0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 6d  nnections that m
1aef0 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
1af00 20 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 68   wants.  ** to h
1af10 61 76 65 20 61 63 63 65 73 73 20 74 6f 20 74 68  ave access to th
1af20 65 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f 0a 20  e pagers..  */. 
1af30 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71 6c 69   for(pPager=sqli
1af40 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20 70 50  te3PagerList; pP
1af50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70 50 61  ager; pPager=pPa
1af60 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ger->pNext){.   
1af70 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65    pPager->iInUse
1af80 4d 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 77  MM = 1;.  }..  w
1af90 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1afa0 5f 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30 20 7c  _OK && (nReq<0 |
1afb0 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71  | nReleased<nReq
1afc0 29 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  ) ){.    PgHdr *
1afd0 70 50 67 3b 0a 20 20 20 20 50 67 48 64 72 20 2a  pPg;.    PgHdr *
1afe0 70 52 65 63 79 63 6c 65 64 3b 0a 20 0a 20 20 20  pRecycled;. .   
1aff0 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
1b000 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
1b010 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
1b020 72 65 71 75 69 72 65 20 61 20 73 79 6e 63 28 29  require a sync()
1b030 2e 20 49 66 0a 20 20 20 20 2a 2a 20 74 68 69 73  . If.    ** this
1b040 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1b050 2c 20 66 69 6e 64 20 6f 6e 65 20 74 68 61 74 20  , find one that 
1b060 64 6f 65 73 20 72 65 71 75 69 72 65 20 61 20 73  does require a s
1b070 79 6e 63 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ync()..    */.  
1b080 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b090 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75  enter(sqlite3_mu
1b0a0 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
1b0b0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
1b0c0 55 29 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73  U));.    pPg = s
1b0d0 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
1b0e0 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a  t.pFirstSynced;.
1b0f0 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26      while( pPg &
1b100 26 20 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  & (pPg->needSync
1b110 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d   || pPg->pPager-
1b120 3e 69 49 6e 55 73 65 44 42 29 20 29 7b 0a 20 20  >iInUseDB) ){.  
1b130 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67      pPg = pPg->g
1b140 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20  free.pNext;.    
1b150 7d 0a 20 20 20 20 69 66 28 20 21 70 50 67 20 29  }.    if( !pPg )
1b160 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71  {.      pPg = sq
1b170 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
1b180 2e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 77  .pFirst;.      w
1b190 68 69 6c 65 28 20 70 50 67 20 26 26 20 70 50 67  hile( pPg && pPg
1b1a0 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65  ->pPager->iInUse
1b1b0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  DB ){.        pP
1b1c0 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e 70  g = pPg->gfree.p
1b1d0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
1b1e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1b1f0 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
1b200 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
1b210 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
1b220 54 49 43 5f 4c 52 55 29 29 3b 0a 0a 20 20 20 20  TIC_LRU));..    
1b230 2f 2a 20 49 66 20 70 50 67 3d 3d 30 2c 20 74 68  /* If pPg==0, th
1b240 65 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f  en the block abo
1b250 76 65 20 68 61 73 20 66 61 69 6c 65 64 20 74 6f  ve has failed to
1b260 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f 0a   find a page to.
1b270 20 20 20 20 2a 2a 20 72 65 63 79 63 6c 65 2e 20      ** recycle. 
1b280 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 74  In this case ret
1b290 75 72 6e 20 65 61 72 6c 79 20 2d 20 6e 6f 20 66  urn early - no f
1b2a0 75 72 74 68 65 72 20 6d 65 6d 6f 72 79 20 77 69  urther memory wi
1b2b0 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 6c  ll.    ** be rel
1b2c0 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eased..    */.  
1b2d0 20 20 69 66 28 20 21 70 50 67 20 29 20 62 72 65    if( !pPg ) bre
1b2e0 61 6b 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 20  ak;..    pPager 
1b2f0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1b300 20 20 20 61 73 73 65 72 74 28 21 70 50 67 2d 3e     assert(!pPg->
1b310 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 3d  needSync || pPg=
1b320 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  =pPager->lru.pFi
1b330 72 73 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  rst);.    assert
1b340 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c  (pPg->needSync |
1b350 7c 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c  | pPg==pPager->l
1b360 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 29  ru.pFirstSynced)
1b370 3b 0a 20 20 0a 20 20 20 20 73 61 76 65 64 42 75  ;.  .    savedBu
1b380 73 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 42 75  sy = pPager->pBu
1b390 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70  syHandler;.    p
1b3a0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1b3b0 6c 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ler = 0;.    rc 
1b3c0 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  = pager_recycle(
1b3d0 70 50 61 67 65 72 2c 20 26 70 52 65 63 79 63 6c  pPager, &pRecycl
1b3e0 65 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ed);.    pPager-
1b3f0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
1b400 73 61 76 65 64 42 75 73 79 3b 0a 20 20 20 20 61  savedBusy;.    a
1b410 73 73 65 72 74 28 70 52 65 63 79 63 6c 65 64 3d  ssert(pRecycled=
1b420 3d 70 50 67 20 7c 7c 20 72 63 21 3d 53 51 4c 49  =pPg || rc!=SQLI
1b430 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 69 66 28 20  TE_OK);.    if( 
1b440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b450 0a 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20  .      /* We've 
1b460 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20  found a page to 
1b470 66 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f  free. At this po
1b480 69 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73  int the page has
1b490 20 62 65 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   been .      ** 
1b4a0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1b4b0 20 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65   page hash-table
1b4c0 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  , free-list and 
1b4d0 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20  synced-list .   
1b4e0 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e     ** (pFirstSyn
1b4f0 63 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c  ced). It is stil
1b500 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67  l in the all pag
1b510 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20  es (pAll) list. 
1b520 0a 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65  .      ** Remove
1b530 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69   it from this li
1b540 73 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  st before freein
1b550 67 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  g..      **.    
1b560 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b    ** Todo: Check
1b570 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74   the Pager.pStmt
1b580 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75   list to make su
1b590 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49  re this is Ok. I
1b5a0 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  t .      ** prob
1b5b0 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a  ably is though..
1b5c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50        */.      P
1b5d0 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  gHdr *pTmp;.    
1b5e0 20 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b    assert( pPg );
1b5f0 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d  .      if( pPg==
1b600 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
1b610 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1b620 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65  >pAll = pPg->pNe
1b630 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c  xtAll;.      }el
1b640 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
1b650 20 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e 70 41   pTmp=pPager->pA
1b660 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41  ll; pTmp->pNextA
1b670 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54  ll!=pPg; pTmp=pT
1b680 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d  mp->pNextAll ){}
1b690 0a 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70  .        pTmp->p
1b6a0 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70  NextAll = pPg->p
1b6b0 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d  NextAll;.      }
1b6c0 0a 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64  .      nReleased
1b6d0 20 2b 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20   += (.          
1b6e0 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70  sizeof(*pPg) + p
1b6f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a  Pager->pageSize.
1b700 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
1b710 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72  of(u32) + pPager
1b720 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20  ->nExtra.       
1b730 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f     + MEMDB*sizeo
1b740 66 28 50 67 48 69 73 74 6f 72 79 29 20 0a 20 20  f(PgHistory) .  
1b750 20 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4f 54      );.      IOT
1b760 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70  RACE(("PGFREE %p
1b770 20 25 64 20 2a 5c 6e 22 2c 20 70 50 61 67 65 72   %d *\n", pPager
1b780 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
1b790 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
1b7a0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67  sqlite3_pager_pg
1b7b0 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  free_count);.   
1b7c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b7d0 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  pPg->pData);.   
1b7e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b7f0 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pPg);.      pPag
1b800 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20  er->nPage--;.   
1b810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
1b820 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   An error occure
1b830 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
1b840 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1b850 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20   file or .      
1b860 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61  ** journal in pa
1b870 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54  ger_recycle(). T
1b880 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20  he error is not 
1b890 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1b8a0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
1b8b0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
1b8c0 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20  n. Instead, set 
1b8d0 74 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64  the Pager.errCod
1b8e0 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20  e variable..    
1b8f0 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77    ** The error w
1b900 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
1b910 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20  to the user (or 
1b920 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61  users, in the ca
1b930 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  se .      ** of 
1b940 61 20 73 68 61 72 65 64 20 70 61 67 65 72 20 63  a shared pager c
1b950 61 63 68 65 29 20 6f 66 20 74 68 65 20 70 61 67  ache) of the pag
1b960 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
1b970 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a   error occured..
1b980 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
1b990 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20  ssert(.         
1b9a0 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49   (rc&0xff)==SQLI
1b9b0 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20  TE_IOERR ||.    
1b9c0 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
1b9d0 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
1b9e0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55     rc==SQLITE_BU
1b9f0 53 59 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  SY.      );.    
1ba00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ba10 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1ba20 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20  ESERVED );.     
1ba30 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
1ba40 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a  ger, rc);.    }.
1ba50 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20    }..  /* Clear 
1ba60 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67  the memory manag
1ba70 65 6d 65 6e 74 20 66 6c 61 67 73 20 61 6e 64 20  ement flags and 
1ba80 72 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74 65  release the mute
1ba90 78 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61  x.  */.  for(pPa
1baa0 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ger=sqlite3Pager
1bab0 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70 50  List; pPager; pP
1bac0 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65  ager=pPager->pNe
1bad0 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65 72  xt){.     pPager
1bae0 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a  ->iInUseMM = 0;.
1baf0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1bb00 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29  tex_leave(mutex)
1bb10 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ;..  /* Return t
1bb20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1bb30 65 73 20 72 65 6c 65 61 73 65 64 0a 20 20 2a 2f  es released.  */
1bb40 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61  .  return nRelea
1bb50 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  sed;.}.#endif /*
1bb60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
1bb70 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
1bb80 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20   */../*.** Read 
1bb90 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
1bba0 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1bbb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1bbc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bbd0 72 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72  readDbPage(Pager
1bbe0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
1bbf0 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pPg, Pgno pgno)
1bc00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36  {.  int rc;.  i6
1bc10 34 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73 65  4 offset;.  asse
1bc20 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a  rt( MEMDB==0 );.
1bc30 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
1bc40 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
1bc50 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
1bc60 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
1bc70 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
1bc80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1bc90 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1bca0 45 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65  EAD;.  }.  offse
1bcb0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
1bcc0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1bcd0 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
1bce0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1bcf0 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  >fd, PGHDR_TO_DA
1bd00 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
1bd10 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
1bd20 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
1bd30 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
1bd40 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
1bd50 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1bd60 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
1bd70 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
1bd80 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1bd90 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  no));.  if( pgno
1bda0 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ==1 ){.    memcp
1bdb0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
1bdc0 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47  eVers, &((u8*)PG
1bdd0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1bde0 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20  )[24],.         
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be10 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67       sizeof(pPag
1be20 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1be30 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  ;.  }.  CODEC1(p
1be40 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
1be50 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
1be60 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45  pgno, 3);.  PAGE
1be70 52 54 52 41 43 45 34 28 22 46 45 54 43 48 20 25  RTRACE4("FETCH %
1be80 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
1be90 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1bea0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1beb0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1bec0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
1bed0 73 68 28 70 50 67 29 29 3b 0a 20 20 72 65 74 75  sh(pPg));.  retu
1bee0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1bef0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1bf00 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
1bf10 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  in the shared lo
1bf20 63 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ck required befo
1bf30 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62  re.** data may b
1bf40 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
1bf50 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
1bf60 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
1bf70 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
1bf80 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
1bf90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1bfa0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d   no-op..**.** Im
1bfb0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
1bfc0 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68  obtaining the sh
1bfd0 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65  ared lock (if re
1bfe0 71 75 69 72 65 64 29 2c 20 74 68 69 73 20 66 75  quired), this fu
1bff0 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73  nction.** checks
1c000 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
1c010 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20  al file. If one 
1c020 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65  is found, an eme
1c030 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a  rgency rollback.
1c040 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ** is performed 
1c050 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a  immediately..*/.
1c060 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1c070 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
1c080 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1c090 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c0a0 0a 20 20 69 6e 74 20 69 73 48 6f 74 20 3d 20 30  .  int isHot = 0
1c0b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1c0c0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
1c0d0 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  ed for exclusive
1c0e0 20 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20   access, has no 
1c0f0 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
1c100 2a 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  * page reference
1c110 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65  s and is in an e
1c120 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20  rror-state, now 
1c130 69 73 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f  is the chance to
1c140 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20   clear.  ** the 
1c150 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74  error. Discard t
1c160 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1c170 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
1c180 6e 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a  nd treat any.  *
1c190 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  * open journal f
1c1a0 69 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  ile as a hot-jou
1c1b0 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rnal..  */.  if(
1c1c0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
1c1d0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
1c1e0 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   && pPager->nRef
1c1f0 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ==0 && pPager->e
1c200 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  rrCode ){.    if
1c210 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1c220 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  lOpen ){.      i
1c230 73 48 6f 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  sHot = 1;.    }.
1c240 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1c250 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
1c260 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
1c270 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1c280 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
1c290 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20   is still in an 
1c2a0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20  error state, do 
1c2b0 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68 65  not proceed. The
1c2c0 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61   error .  ** sta
1c2d0 74 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  te will be clear
1c2e0 65 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  ed at some point
1c2f0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
1c300 68 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20 20  hen all page .  
1c310 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61 72  ** references ar
1c320 65 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74 68  e dropped and th
1c330 65 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64  e cache can be d
1c340 69 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20  iscarded..  */. 
1c350 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1c360 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
1c370 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
1c380 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
1c390 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1c3a0 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  de;.  }..  if( p
1c3b0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1c3c0 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73  GER_UNLOCK || is
1c3d0 48 6f 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Hot ){.    sqlit
1c3e0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1c3f0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
1c400 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
1c410 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1c420 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ger->nRef==0 );.
1c430 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1c440 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b  r->noReadlock ){
1c450 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
1c460 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
1c470 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
1c480 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
1c490 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1c4b0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1c4c0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
1c4d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c4e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c4f0 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
1c500 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
1c510 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  .      /* If a j
1c520 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
1c530 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
1c540 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
1c550 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  k on the.      *
1c560 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
1c570 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
1c580 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
1c590 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
1c5a0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
1c5b0 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75     if( hasHotJou
1c5c0 72 6e 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20  rnal(pPager) || 
1c5d0 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 20  isHot ){.       
1c5e0 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55   /* Get an EXCLU
1c5f0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1c600 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1c610 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
1c620 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   is.        ** i
1c630 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
1c640 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
1c650 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
1c660 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
1c670 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55          ** EXCLU
1c680 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
1c690 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
1c6a0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
1c6b0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  n the.        **
1c6c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1c6d0 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
1c6e0 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
1c6f0 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
1c700 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62          ** datab
1c710 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
1c720 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
1c730 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
1c740 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20  rolling it .    
1c750 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20      ** back..   
1c760 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
1c770 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
1c780 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
1c790 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
1c7a0 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  t requested, the
1c7b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  .        ** seco
1c7c0 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20  nd process will 
1c7d0 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  get to this poin
1c7e0 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
1c7f0 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20  d fail to.      
1c800 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 73 20    ** obtain its 
1c810 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
1c820 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1c830 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  se file..       
1c840 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1c850 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58  pPager->state<EX
1c860 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
1c870 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1c880 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
1c890 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
1c8a0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
1c8b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c8c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c8d0 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
1c8e0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
1c8f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
1c900 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
1c910 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
1c920 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 50 61   }.          pPa
1c930 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1c940 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
1c950 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
1c960 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
1c970 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
1c980 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
1c990 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
1c9a0 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65         ** we are
1c9b0 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20   unable to open 
1c9c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c9d0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
1c9e0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
1c9f0 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
1ca00 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
1ca10 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
1ca20 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
1ca30 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
1ca40 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
1ca50 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1ca60 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
1ca70 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
1ca80 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
1ca90 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
1caa0 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
1cab0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
1cac0 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
1cad0 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
1cae0 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
1caf0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1cb00 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
1cb10 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
1cb20 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69  e access. This i
1cb30 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20  s because in .  
1cb40 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
1cb50 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
1cb60 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1cb70 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
1cb80 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  open and.       
1cb90 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
1cba0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
1cbb0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
1cbc0 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
1cbd0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73  he.        ** Os
1cbe0 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20  Truncate() call 
1cbf0 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76  used in exclusiv
1cc00 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c  e-access mode al
1cc10 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  so requires.    
1cc20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72      ** a read/wr
1cc30 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  ite file handle.
1cc40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1cc50 20 20 20 20 69 66 28 20 21 69 73 48 6f 74 20 29      if( !isHot )
1cc60 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1cc70 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1cc80 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1cc90 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1cca0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1ccb0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
1ccc0 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20 20 20  S_EXISTS) ){.   
1ccd0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
1cce0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
1ccf0 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
1cd00 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1cd10 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
1cd20 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
1cd30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1cd40 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1cd50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1cd60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
1cd70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
1cd80 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
1cd90 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74  r->jfd, f, &fout
1cda0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
1cdb0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1cdc0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
1cdd0 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b  jfd->pMethods );
1cde0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1cdf0 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
1ce00 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1ce20 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1ce40 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
1ce50 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
1ce60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ce70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1ce80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1ce90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1cea0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
1ceb0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1cec0 20 20 20 20 73 77 69 74 63 68 28 20 72 63 20 29      switch( rc )
1ced0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  {.            ca
1cee0 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  se SQLITE_NOMEM:
1cef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73  .            cas
1cf00 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  e SQLITE_IOERR_U
1cf10 4e 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  NLOCK:.         
1cf20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
1cf30 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 0a 20 20 20 20  OERR_NOMEM:.    
1cf40 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1cf50 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20   rc;.           
1cf60 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
1cf70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1cf80 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1cf90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cfa0 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
1cfb0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
1cfc0 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  1;.        pPage
1cfd0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1cfe0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  d = 0;.        p
1cff0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1d000 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  f = 0;.        p
1d010 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
1d020 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
1d030 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1d040 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 20 20   = 0;. .        
1d050 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
1d060 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1d070 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
1d080 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
1d090 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
1d0a0 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
1d0b0 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ead lock..      
1d0c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
1d0d0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1d0e0 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
1d0f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d110 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
1d120 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1d130 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
1d140 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
1d150 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1d160 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20  R_SHARED || .   
1d170 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
1d180 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1d190 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
1d1a0 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  >PAGER_SHARED). 
1d1b0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1d1c0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  }..      if( pPa
1d1d0 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20  ger->pAll ){.   
1d1e0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
1d1f0 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
1d200 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
1d210 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1d220 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ile.        ** a
1d230 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  nd there are alr
1d240 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68  eady pages in th
1d250 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20  e cache (from a 
1d260 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20  previous.       
1d270 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74   ** read or writ
1d280 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20  e transaction). 
1d290 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1d2a0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
1d2b0 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65        ** has bee
1d2c0 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
1d2d0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1d2e0 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20   changed, flush 
1d2f0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
1d300 61 63 68 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ache..        **
1d310 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 61 74 61  .        ** Data
1d320 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20  base changes is 
1d330 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
1d340 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
1d350 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
1d360 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
1d370 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
1d380 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
1d390 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
1d3a0 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  are.        ** a
1d3b0 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
1d3c0 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
1d3d0 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
1d3e0 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
1d3f0 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
1d400 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
1d410 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
1d420 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
1d430 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20       ** a codec 
1d440 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20  is in use..     
1d450 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a     ** .        *
1d460 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
1d470 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
1d480 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
1d490 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
1d4a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74 65  .        ** dete
1d4b0 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
1d4c0 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
1d4d0 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
1d4e0 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
1d4f0 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
1d500 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
1d510 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68     */.        ch
1d520 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
1d530 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1d540 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20  ileVers)];.     
1d550 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
1d560 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
1d570 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
1d580 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1d590 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1d5a0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1d5b0 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  de;.        }.. 
1d5c0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1d5d0 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20  r->dbSize>0 ){. 
1d5e0 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
1d5f0 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
1d600 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
1d610 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
1d620 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1d630 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1d640 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
1d650 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
1d660 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
1d670 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1d680 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d690 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1d6a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
1d6b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1d6c0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  {.          mems
1d6d0 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
1d6e0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
1d6f0 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ers));.        }
1d700 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65  ..        if( me
1d710 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
1d720 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
1d730 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
1d740 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
1d750 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72           pager_r
1d760 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1d770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d780 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1d790 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
1d7a0 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
1d7b0 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f  r->state<=PAGER_
1d7c0 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66  SHARED );.    if
1d7d0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1d7e0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
1d7f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
1d800 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
1d810 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RED;.    }.  }..
1d820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d830 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
1d840 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e 20 20   PgHdr object.  
1d850 20 45 69 74 68 65 72 20 63 72 65 61 74 65 20 61   Either create a
1d860 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65 75 73   new one or reus
1d870 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  e.** an existing
1d880 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74   one that is not
1d890 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75 73   otherwise in us
1d8a0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50  e..**.** A new P
1d8b0 67 48 64 72 20 73 74 72 75 63 74 75 72 65 20 69  gHdr structure i
1d8c0 73 20 63 72 65 61 74 65 64 20 69 66 20 61 6e 79  s created if any
1d8d0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1d8e0 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a  g are.** true:.*
1d8f0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65  *.**     (1)  We
1d900 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65 65 64   have not exceed
1d910 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61  ed our maximum a
1d920 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65 20 73  llocated cache s
1d930 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ize.**          
1d940 61 73 20 73 65 74 20 62 79 20 74 68 65 20 22 50  as set by the "P
1d950 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
1d960 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  " command..**.**
1d970 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20       (2)  There 
1d980 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20 50 67  are no unused Pg
1d990 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76 61 69  Hdr objects avai
1d9a0 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20 74 69  lable at this ti
1d9b0 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33  me..**.**     (3
1d9c0 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  )  This is an in
1d9d0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1d9e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20  ..**.**     (4) 
1d9f0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 50 67   There are no Pg
1da00 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68 61 74  Hdr objects that
1da10 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
1da20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  a journal.**    
1da30 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e 63 20        file sync 
1da40 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20 74 68  and a sync of th
1da50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1da60 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  s currently.**  
1da70 20 20 20 20 20 20 20 20 70 72 6f 68 69 62 69 74          prohibit
1da80 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ed..**.** Otherw
1da90 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20 65 78  ise, reuse an ex
1daa0 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20 20 49  isting PgHdr.  I
1dab0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
1dac0 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74  euse an.** exist
1dad0 69 6e 67 20 50 67 48 64 72 20 69 66 20 61 6c 6c  ing PgHdr if all
1dae0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1daf0 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
1db00 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68 61  *     (1)  We ha
1db10 76 65 20 72 65 61 63 68 65 64 20 6f 72 20 65 78  ve reached or ex
1db20 63 65 65 64 65 64 20 74 68 65 20 6d 61 78 69 6d  ceeded the maxim
1db30 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a  um cache size.**
1db40 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65            allowe
1db50 64 20 62 79 20 22 50 52 41 47 4d 41 20 63 61 63  d by "PRAGMA cac
1db60 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20  he_size"..**.** 
1db70 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20 69      (2)  There i
1db80 73 20 61 20 50 67 48 64 72 20 61 76 61 69 6c 61  s a PgHdr availa
1db90 62 6c 65 20 77 69 74 68 20 50 67 48 64 72 2d 3e  ble with PgHdr->
1dba0 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20  nRef==0.**.**   
1dbb0 20 20 28 33 29 20 20 57 65 20 61 72 65 20 6e 6f    (3)  We are no
1dbc0 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  t in an in-memor
1dbd0 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  y database.**.**
1dbe0 20 20 20 20 20 28 34 29 20 20 45 69 74 68 65 72       (4)  Either
1dbf0 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 76 61   there is an ava
1dc00 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74 68 61  ilable PgHdr tha
1dc10 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a  t does not need.
1dc20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 62  **          to b
1dc30 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  e synced to disk
1dc40 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20 73 79   or else disk sy
1dc50 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74  ncing is current
1dc60 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61  ly.**          a
1dc70 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  llowed..*/.stati
1dc80 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63  c int pagerAlloc
1dc90 61 74 65 50 61 67 65 28 50 61 67 65 72 20 2a 70  atePage(Pager *p
1dca0 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70  Pager, PgHdr **p
1dcb0 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
1dcc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
1dcd0 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
1dce0 6e 42 79 74 65 48 64 72 3b 0a 0a 20 20 2f 2a 20  nByteHdr;..  /* 
1dcf0 43 72 65 61 74 65 20 61 20 6e 65 77 20 50 67 48  Create a new PgH
1dd00 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  dr if any of the
1dd10 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73   four conditions
1dd20 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61   defined .  ** a
1dd30 62 6f 76 65 20 61 72 65 20 6d 65 74 3a 20 2a 2f  bove are met: */
1dd40 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
1dd50 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50  Page<pPager->mxP
1dd60 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  age.   || pPager
1dd70 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30 20  ->lru.pFirst==0 
1dd80 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20  .   || MEMDB.   
1dd90 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e  || (pPager->lru.
1dda0 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
1ddb0 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  && pPager->doNot
1ddc0 53 79 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 76  Sync).  ){.    v
1ddd0 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
1dde0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
1ddf0 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  e>=pPager->nHash
1de00 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
1de10 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c  resize_hash_tabl
1de20 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  e(pPager,.      
1de30 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68     pPager->nHash
1de40 3c 32 35 36 20 3f 20 32 35 36 20 3a 20 70 50 61  <256 ? 256 : pPa
1de50 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20  ger->nHash*2);. 
1de60 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1de70 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  >nHash==0 ){.   
1de80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1de90 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1dea0 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
1deb0 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ate_out;.      }
1dec0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
1ded0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
1dee0 20 20 20 6e 42 79 74 65 48 64 72 20 3d 20 73 69     nByteHdr = si
1def0 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 73 69 7a  zeof(*pPg) + siz
1df00 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65  eof(u32) + pPage
1df10 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20  r->nExtra.      
1df20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a          + MEMDB*
1df30 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
1df40 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c  );.    pPg = sql
1df50 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
1df60 74 65 48 64 72 20 29 3b 0a 20 20 20 20 69 66 28  teHdr );.    if(
1df70 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70 44   pPg ){.      pD
1df80 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ata = sqlite3_ma
1df90 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61  lloc( pPager->pa
1dfa0 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
1dfb0 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29 7b 0a  if( pData==0 ){.
1dfc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1dfd0 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  free(pPg);.     
1dfe0 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
1dff0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
1e000 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
1e010 3b 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30  ;.    if( pPg==0
1e020 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1e030 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1e040 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c     goto pager_al
1e050 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20  locate_out;.    
1e060 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67  }.    memset(pPg
1e070 2c 20 30 2c 20 6e 42 79 74 65 48 64 72 29 3b 0a  , 0, nByteHdr);.
1e080 20 20 20 20 70 50 67 2d 3e 70 44 61 74 61 20 3d      pPg->pData =
1e090 20 70 44 61 74 61 3b 0a 20 20 20 20 70 50 67 2d   pData;.    pPg-
1e0a0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
1e0b0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
1e0c0 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
1e0d0 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ll;.    pPager->
1e0e0 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
1e0f0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
1e100 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1e110 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73   Recycle an exis
1e120 74 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61  ting page with a
1e130 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e   zero ref-count.
1e140 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
1e150 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
1e160 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66  r, &pPg);.    if
1e170 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
1e180 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  Y ){.      rc = 
1e190 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
1e1a0 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CKED;.    }.    
1e1b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e1c0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
1e1d0 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
1e1e0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ut;.    }.    as
1e1f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1e200 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
1e210 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70   );.    assert(p
1e220 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67  Pg);.  }.  *ppPg
1e230 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61   = pPg;..pager_a
1e240 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72  llocate_out:.  r
1e250 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e260 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  ** Make sure we 
1e270 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  have the content
1e280 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66   for a page.  If
1e290 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a   the page was.**
1e2a0 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75   previously acqu
1e2b0 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74  ired with noCont
1e2c0 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  ent==1, then the
1e2d0 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20   content was.** 
1e2e0 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 64  just initialized
1e2f0 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65 61   to zeros instea
1e300 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20  d of being read 
1e310 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75  from disk..** Bu
1e320 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74 68  t now we need th
1e330 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66 20  e real data off 
1e340 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b  of disk.  So mak
1e350 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61 76  e sure we.** hav
1e360 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20 69  e it.  Read it i
1e370 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68  n if we do not h
1e380 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e 0a  ave it already..
1e390 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1e3a0 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
1e3b0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
1e3c0 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64  f( pPg->needRead
1e3d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
1e3e0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2d   readDbPage(pPg-
1e3f0 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50  >pPager, pPg, pP
1e400 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  g->pgno);.    if
1e410 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e420 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
1e430 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20  edRead = 0;.    
1e440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
1e450 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1e460 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1e470 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
1e480 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a  cquire a page..*
1e490 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b  *.** A read lock
1e4a0 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
1e4b0 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68  e is obtained wh
1e4c0 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  en the first pag
1e4d0 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a  e is acquired. .
1e4e0 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63  ** This read loc
1e4f0 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65  k is dropped whe
1e500 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
1e510 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
1e520 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e530 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61  works for any pa
1e540 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge number greate
1e550 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68  r than 0.  If th
1e560 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
1e570 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  le is smaller th
1e580 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
1e590 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61   page, then no a
1e5a0 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65  ctual disk.** re
1e5b0 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ad occurs and th
1e5c0 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
1e5d0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e  f the page is in
1e5e0 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20  itialized to.** 
1e5f0 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20  all zeros.  The 
1e600 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
1e610 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
1e620 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
1e630 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20  zed.** to zeros 
1e640 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
1e650 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
1e660 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  into memory..**.
1e670 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
1e680 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
1e690 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
1e6a0 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
1e6b0 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
1e6c0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
1e6d0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1e6e0 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
1e6f0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
1e700 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
1e710 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
1e720 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
1e730 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
1e740 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
1e750 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
1e760 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
1e770 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
1e780 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
1e790 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
1e7a0 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
1e7b0 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
1e7c0 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
1e7d0 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
1e7e0 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
1e7f0 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
1e800 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
1e810 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
1e820 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
1e830 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
1e840 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
1e850 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
1e860 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
1e870 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
1e880 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
1e890 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
1e8a0 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
1e8b0 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
1e8c0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  les..**.** If no
1e8d0 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65  Content is false
1e8e0 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
1e8f0 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79  nts are actually
1e900 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e   read from disk.
1e910 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
1e920 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
1e930 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
1e940 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
1e950 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
1e960 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
1e970 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74   time, so do not
1e980 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e   do a disk read.
1e990 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
1e9a0 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65  he.** page conte
1e9b0 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20  nt with zeros.  
1e9c0 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63  But mark the fac
1e9d0 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6e  t that we have n
1e9e0 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63  ot read the.** c
1e9f0 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e  ontent by settin
1ea00 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  g the PgHdr.need
1ea10 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65  Read flag.  Late
1ea20 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c  r on, if .** sql
1ea30 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1ea40 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
1ea50 69 73 20 70 61 67 65 20 6f 72 20 69 66 20 74 68  is page or if th
1ea60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
1ea70 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77 69   called again wi
1ea80 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c  th noContent==0,
1ea90 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
1eaa0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20   the content is 
1eab0 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68  needed.** and th
1eac0 65 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f 75  e disk read shou
1ead0 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
1eae0 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
1eaf0 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69  c int pagerAcqui
1eb00 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
1eb10 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
1eb20 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
1eb30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1eb40 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
1eb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1eb60 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
1eb70 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
1eb80 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
1eb90 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
1eba0 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
1ebb0 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
1ebc0 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
1ebd0 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
1ebe0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
1ebf0 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
1ec00 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
1ec10 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1ec20 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1ec30 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
1ec40 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  || pPager->nRef>
1ec50 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a  0 || pgno==1 );.
1ec60 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75  .  /* The maximu
1ec70 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
1ec80 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
1ec90 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
1eca0 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  a page.  ** numb
1ecb0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
1ecc0 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69  this, or zero, i
1ecd0 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
1ece0 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47  /.  if( pgno>PAG
1ecf0 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
1ed00 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
1ed10 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1ed20 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
1ed30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1ed40 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
1ed50 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
1ed60 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79  have not hit any
1ed70 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73   critical errors
1ed80 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74  ..  */ .  assert
1ed90 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
1eda0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20   *ppPage = 0;.. 
1edb0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1edc0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63  he first page ac
1edd0 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74  cessed, then get
1ede0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20   a SHARED lock. 
1edf0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
1ee00 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53  ase file. pagerS
1ee10 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61  haredLock() is a
1ee20 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20   no-op if .  ** 
1ee30 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  a database lock 
1ee40 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e  is already held.
1ee50 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
1ee60 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61  erSharedLock(pPa
1ee70 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
1ee80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ee90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1eea0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1eeb0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
1eec0 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20  NLOCK );..  pPg 
1eed0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1eee0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1eef0 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
1ef00 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1ef10 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  ed page is not i
1ef20 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
1ef30 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61  . */.    int nMa
1ef40 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  x;.    int h;.  
1ef50 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1ef60 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
1ef70 20 72 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f 63   rc = pagerAlloc
1ef80 61 74 65 50 61 67 65 28 70 50 61 67 65 72 2c 20  atePage(pPager, 
1ef90 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  &pPg);.    if( r
1efa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1efb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1efc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d  .    }..    pPg-
1efd0 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
1efe0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
1eff0 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d   || pgno>pPager-
1f000 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20 20  >stmtSize );.   
1f010 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1f020 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  = sqlite3BitvecT
1f030 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
1f040 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20  ournal, pgno);. 
1f050 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
1f060 20 3d 20 30 3b 0a 0a 20 20 20 20 6d 61 6b 65 43   = 0;..    makeC
1f070 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70  lean(pPg);.    p
1f080 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 0a 20  Pg->nRef = 1;.. 
1f090 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b     pPager->nRef+
1f0a0 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  +;.    if( pPage
1f0b0 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
1f0c0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
1f0d0 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
1f0e0 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
1f0f0 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
1f100 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71   }.    nMax = sq
1f110 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1f120 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
1f130 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1f140 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Code ){.      rc
1f150 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
1f160 64 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  de;.      sqlite
1f170 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1f180 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1f190 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
1f1a0 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61   Populate the pa
1f1b0 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65 69  ge with data, ei
1f1c0 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67 20  ther by reading 
1f1d0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1f1e0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f  e.    ** file, o
1f1f0 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  r by setting the
1f200 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20   entire page to 
1f210 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  zero..    */.   
1f220 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70   if( nMax<(int)p
1f230 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  gno || MEMDB || 
1f240 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70  (noContent && !p
1f250 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1f260 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  lback) ){.      
1f270 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
1f280 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
1f290 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1f2a0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
1f2b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f2c0 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20  _FULL;.      }. 
1f2d0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
1f2e0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1f2f0 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
1f300 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  ize);.      pPg-
1f310 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f 43 6f  >needRead = noCo
1f320 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65 72  ntent && !pPager
1f330 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1f340 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1f350 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
1f360 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1f370 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f380 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1f390 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  e(pPager, pPg, p
1f3a0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1f3b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1f3c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1f3d0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1f3e0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e          pPg->pgn
1f3f0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  o = 0;.        s
1f400 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1f410 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
1f420 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f430 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  }.      pPg->nee
1f440 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  dRead = 0;.    }
1f450 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  ..    /* Link th
1f460 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
1f470 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65 20  page hash table 
1f480 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20  */.    h = pgno 
1f490 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
1f4a0 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1);.    assert(
1f4b0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20   pgno!=0 );.    
1f4c0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
1f4d0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1f4e0 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
1f4f0 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
1f500 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
1f510 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
1f520 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
1f530 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
1f540 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
1f550 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
1f560 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
1f570 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1f580 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1f590 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
1f5a0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
1f5b0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
1f5c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1f5d0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
1f5e0 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
1f5f0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61   cache. */.    a
1f600 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52  ssert(pPager->nR
1f610 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29  ef>0 || pgno==1)
1f620 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
1f630 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
1f640 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65      if( !noConte
1f650 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
1f660 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
1f670 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  nt(pPg);.      i
1f680 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1f690 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f6a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
1f6b0 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  ge_ref(pPg);.  }
1f6c0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67  .  *ppPage = pPg
1f6d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1f6e0 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
1f6f0 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
1f700 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1f710 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
1f720 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
1f730 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1f740 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
1f750 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
1f760 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
1f770 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
1f780 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
1f790 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1f7a0 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
1f7b0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
1f7c0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
1f7d0 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
1f7e0 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
1f7f0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
1f800 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45  int rc;.  pagerE
1f810 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
1f820 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72  rc = pagerAcquir
1f830 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
1f840 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
1f850 74 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  t);.  pagerLeave
1f860 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1f870 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1f880 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
1f890 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
1f8a0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
1f8b0 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
1f8c0 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
1f8d0 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
1f8e0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1f8f0 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
1f900 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
1f910 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
1f920 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
1f930 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1f940 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
1f950 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
1f960 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
1f970 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
1f980 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
1f990 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
1f9a0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
1f9b0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
1f9c0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
1f9d0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
1f9e0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1f9f0 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
1fa00 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
1fa10 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
1fa20 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
1fa30 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
1fa40 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
1fa50 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
1fa60 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
1fa70 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
1fa80 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
1fa90 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
1faa0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
1fab0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
1fac0 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ..  pagerEnter(p
1fad0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
1fae0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1faf0 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
1fb00 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1fb10 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65 72  ->pAll || pPager
1fb20 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1fb30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
1fb40 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
1fb50 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
1fb60 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
1fb70 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  {.    /* Do noth
1fb80 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ing */.  }else i
1fb90 66 28 20 28 70 50 67 20 3d 20 70 61 67 65 72 5f  f( (pPg = pager_
1fba0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
1fbb0 67 6e 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gno))!=0 ){.    
1fbc0 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
1fbd0 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
1fbe0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
1fbf0 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
1fc00 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
1fc10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
1fc20 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
1fc30 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
1fc40 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
1fc50 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
1fc60 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
1fc70 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
1fc80 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
1fc90 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
1fca0 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
1fcb0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
1fcc0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
1fcd0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
1fce0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
1fcf0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1fd00 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
1fd10 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1fd20 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
1fd30 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
1fd40 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
1fd50 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a  t for this page.
1fd60 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1fd70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
1fd80 70 61 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e  pagerEnter(pPg->
1fd90 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e  pPager);.  pPg->
1fda0 6e 52 65 66 2d 2d 3b 0a 0a 20 20 43 48 45 43 4b  nRef--;..  CHECK
1fdb0 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
1fdc0 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
1fdd0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
1fde0 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20  to a page reach 
1fdf0 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  0, call the.  **
1fe00 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20   destructor and 
1fe10 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20  add the page to 
1fe20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
1fe30 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  */.  if( pPg->nR
1fe40 65 66 3d 3d 30 20 29 7b 0a 0a 20 20 20 20 6c 72  ef==0 ){..    lr
1fe50 75 4c 69 73 74 41 64 64 28 70 50 67 29 3b 0a 20  uListAdd(pPg);. 
1fe60 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
1fe70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
1fe80 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73      pPager->xDes
1fe90 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61  tructor(pPg, pPa
1fea0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1feb0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
1fec0 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72  When all pages r
1fed0 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  each the freelis
1fee0 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64  t, drop the read
1fef0 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a   lock from.    *
1ff00 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1ff10 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
1ff20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  pPager->nRef--;.
1ff30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ff40 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20  er->nRef>=0 );. 
1ff50 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
1ff60 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67  Ref==0 && (!pPag
1ff70 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
1ff80 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
1ff90 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20  rnalOff>0) ){.  
1ffa0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
1ffb0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
1ffc0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1ffd0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
1ffe0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
1fff0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20000 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61   Create a journa
20010 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  l file for pPage
20020 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64  r.  There should
20030 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
20040 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43  SERVED.** or EXC
20050 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
20060 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20070 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
20080 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
20090 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
200a0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
200b0 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ng.  Return an e
200c0 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65  rror code and re
200d0 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69  lease the.** wri
200e0 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68  te lock if anyth
200f0 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
20100 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
20110 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
20120 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
20130 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
20140 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
20150 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  Vfs;.  int flags
20160 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
20170 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
20180 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
20190 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
201a0 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a  TE);..  int rc;.
201b0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
201c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
201d0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
201e0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
201f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20200 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
20210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20220 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
20230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20240 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
20250 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  =0 );.  sqlite3P
20260 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
20270 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65  ager);.  pagerLe
20280 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ave(pPager);.  p
20290 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
202a0 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
202b0 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
202c0 64 62 53 69 7a 65 29 3b 0a 20 20 70 61 67 65 72  dbSize);.  pager
202d0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
202e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
202f0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
20300 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
20310 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  MEM;.    goto fa
20320 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
20330 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  rnal;.  }..  if(
20340 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
20350 65 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  e ){.    flags |
20360 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  = (SQLITE_OPEN_D
20370 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
20380 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
20390 55 52 4e 41 4c 29 3b 0a 20 20 7d 65 6c 73 65 7b  URNAL);.  }else{
203a0 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53  .    flags |= (S
203b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
203c0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d 0a 23 69  JOURNAL);.  }.#i
203d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
203e0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
203f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
20400 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20  urnalOpen(.     
20410 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
20420 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
20430 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e  >jfd, flags, jrn
20440 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
20450 65 72 29 0a 20 20 29 3b 0a 23 65 6c 73 65 0a 20  er).  );.#else. 
20460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
20470 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
20480 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
20490 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
204a0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  0);.#endif.  ass
204b0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
204c0 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66  OK || pPager->jf
204d0 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20  d->pMethods );. 
204e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
204f0 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
20500 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
20510 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
20520 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66  nalHdr = 0;.  if
20530 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20540 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
20550 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
20560 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
20570 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
20580 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
20590 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
205a0 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
205b0 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50  ournal;.  }.  pP
205c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
205d0 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
205e0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
205f0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
20600 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
20610 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
20620 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
20630 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
20640 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
20650 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
20660 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
20670 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
20680 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
20690 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  l;.  }.  pPager-
206a0 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
206b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
206c0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
206d0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a  alHdr(pPager);..
206e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
206f0 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63  mtAutoopen && rc
20700 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20710 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20720 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50  agerStmtBegin(pP
20730 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
20740 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
20750 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
20760 45 4d 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  EM && rc!=SQLITE
20770 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
20780 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
20790 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
207a0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
207b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
207c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
207d0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
207e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
207f0 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
20800 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
20810 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
20820 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
20830 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
20840 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
20850 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20860 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77  *.** Acquire a w
20870 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
20880 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
20890 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20  lock is removed 
208a0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20  when.** the any 
208b0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
208c0 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20   happen:.**.**  
208d0 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
208e0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
208f0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
20900 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
20910 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  Rollback() is ca
20920 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
20930 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
20940 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
20950 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
20960 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  rUnref() is call
20970 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
20980 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
20990 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
209a0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
209b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
209c0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
209d0 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
209e0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
209f0 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
20a00 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
20a10 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
20a20 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
20a30 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
20a40 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
20a50 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
20a60 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
20a70 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
20a80 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
20a90 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
20aa0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
20ab0 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
20ac0 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
20ad0 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
20ae0 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
20af0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
20b00 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
20b10 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
20b20 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
20b30 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
20b40 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
20b50 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
20b60 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
20b70 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
20b80 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
20b90 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
20ba0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
20bb0 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
20bc0 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
20bd0 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
20be0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
20bf0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
20c00 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
20c10 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
20c20 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
20c30 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
20c40 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67  .**.** If exFlag
20c50 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65   is true, go ahe
20c60 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58  ad and get an EX
20c70 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
20c80 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65  the file.** imme
20c90 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20  diately instead 
20ca0 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c  of waiting until
20cb0 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68   we try to flush
20cc0 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
20cd0 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67  .** exFlag is ig
20ce0 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73  nored if a trans
20cf0 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
20d00 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  y active..*/.int
20d10 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
20d20 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20  in(DbPage *pPg, 
20d30 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
20d40 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
20d50 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
20d60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20d70 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
20d80 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
20d90 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
20da0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20db0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
20dc0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
20dd0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
20de0 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
20df0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
20e00 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
20e10 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   );.    if( MEMD
20e20 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
20e30 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
20e40 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
20e50 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
20e60 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
20e70 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  bSize;.    }else
20e80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20e90 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
20ea0 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
20eb0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
20ec0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20ed0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
20ee0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
20ef0 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
20f00 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
20f10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
20f20 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
20f30 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
20f40 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
20f50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
20f60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20f70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20f80 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
20f90 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  r);.        retu
20fa0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
20fb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
20fc0 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
20fd0 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
20fe0 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
20ff0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
21000 72 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  r));.      if( p
21010 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
21020 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
21030 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
21040 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
21050 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
21060 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
21070 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
21080 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
21090 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
210a0 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
210b0 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
210c0 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
210d0 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  was in exclusive
210e0 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 6c 61 73  -access mode las
210f0 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20  t.    ** time a 
21100 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20  (read or write) 
21110 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
21120 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e  successfully con
21130 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79  cluded.    ** by
21140 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
21150 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c  . Instead of del
21160 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eting the journa
21170 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20  l file it was . 
21180 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20     ** kept open 
21190 61 6e 64 20 74 72 75 6e 63 61 74 65 64 20 74 6f  and truncated to
211a0 20 30 20 62 79 74 65 73 2e 0a 20 20 20 20 2a 2f   0 bytes..    */
211b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
211c0 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a  ger->nRec==0 );.
211d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
211e0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d  er->origDbSize==
211f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
21200 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
21210 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  nal==0 );.    sq
21220 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
21230 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
21240 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
21250 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
21260 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
21270 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
21280 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e( pPager->dbSiz
21290 65 20 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e  e );.    pagerEn
212a0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ter(pPager);.   
212b0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70 49   if( !pPager->pI
212c0 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  nJournal ){.    
212d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
212e0 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
212f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72        pPager->or
21300 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
21310 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
21320 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
21330 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
21340 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
21350 74 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t( !pPager->jour
21360 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65  nalOpen || pPage
21370 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20  r->journalOff>0 
21380 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
21390 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   );.  pagerLeave
213a0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
213b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
213c0 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74  Make a page dirt
213d0 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74  y.  Set its dirt
213e0 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69  y flag and add i
213f0 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a  t to the dirty.*
21400 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  * page list..*/.
21410 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
21420 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67  Dirty(PgHdr *pPg
21430 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
21440 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  rty==0 ){.    Pa
21450 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
21460 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
21470 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
21480 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
21490 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b   pPager->pDirty;
214a0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
214b0 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  >pDirty ){.     
214c0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d   pPager->pDirty-
214d0 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50  >pPrevDirty = pP
214e0 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  g;.    }.    pPg
214f0 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30  ->pPrevDirty = 0
21500 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  ;.    pPager->pD
21510 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  irty = pPg;.  }.
21520 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
21530 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65  page clean.  Cle
21540 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74  ar its dirty bit
21550 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66   and remove it f
21560 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  rom the.** dirty
21570 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
21580 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43  tatic void makeC
21590 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29  lean(PgHdr *pPg)
215a0 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
215b0 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64  ty ){.    pPg->d
215c0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
215d0 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b  ( pPg->pDirty ){
215e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
215f0 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  Pg->pDirty->pPre
21600 76 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20  vDirty==pPg );. 
21610 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
21620 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
21630 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a  Pg->pPrevDirty;.
21640 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
21650 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b  g->pPrevDirty ){
21660 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21670 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e  Pg->pPrevDirty->
21680 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20  pDirty==pPg );. 
21690 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44       pPg->pPrevD
216a0 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70  irty->pDirty = p
216b0 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
216c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
216d0 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
216e0 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b  ->pDirty==pPg );
216f0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
21700 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  er->pDirty = pPg
21710 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
21720 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61    }.}.../*.** Ma
21730 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
21740 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68  s writeable.  Th
21750 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
21760 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
21770 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  al .** if it is 
21780 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
21790 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
217a0 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
217b0 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a  before making.**
217c0 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
217d0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
217e0 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
217f0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
21800 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74   the pager creat
21810 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72  es a new.** jour
21820 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73  nal and acquires
21830 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
21840 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21850 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56  .  If the RESERV
21860 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64  ED.** lock could
21870 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64   not be acquired
21880 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
21890 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
218a0 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  SY.  The.** call
218b0 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  ing routine must
218c0 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20   check for that 
218d0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64  return value and
218e0 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
218f0 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79  to.** change any
21900 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c   page data until
21910 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
21920 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
21930 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
21940 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64  urnal file could
21950 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
21960 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b  because the disk
21970 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65   is full,.** the
21980 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
21990 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55  eturns SQLITE_FU
219a0 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69  LL and does an i
219b0 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63  mmediate rollbac
219c0 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71  k..** All subseq
219d0 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d  uent write attem
219e0 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20  pts also return 
219f0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69  SQLITE_FULL unti
21a00 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20  l there.** is a 
21a10 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
21a20 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20  agerCommit() or 
21a30 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
21a40 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73  back() to.** res
21a50 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
21a60 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
21a70 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69  Hdr *pPg){.  voi
21a80 64 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52  d *pData = PGHDR
21a90 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
21aa0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
21ab0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
21ac0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21ad0 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
21ae0 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
21af0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
21b00 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65  rCode ){ .    re
21b10 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
21b20 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
21b30 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
21b40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
21b50 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
21b60 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
21b70 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
21b80 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
21b90 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
21ba0 69 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76  is page was prev
21bb0 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20  iously acquired 
21bc0 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
21bd0 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20  1, that means.  
21be0 2a 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61  ** we didn't rea
21bf0 6c 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20  lly read in the 
21c00 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
21c10 61 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68  age.  This can h
21c20 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20  appen.  ** (for 
21c30 65 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68  example) when th
21c40 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
21c50 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
21c60 65 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a  elist.  But.  **
21c70 20 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72   now we are (per
21c80 68 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65  haps) moving the
21c90 20 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65   page off of the
21ca0 20 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20   freelist for.  
21cb0 2a 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20  ** reuse and we 
21cc0 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73  need to know its
21cd0 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
21ce0 74 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e  t so that conten
21cf0 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74  t.  ** can be st
21d00 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ored in the roll
21d10 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53  back journal.  S
21d20 6f 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74  o do the read at
21d30 20 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e   this.  ** time.
21d40 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
21d50 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
21d60 50 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  Pg);.  if( rc ){
21d70 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21d80 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
21d90 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
21da0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
21db0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
21dc0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
21dd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
21de0 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
21df0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
21e00 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29    makeDirty(pPg)
21e10 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
21e20 6f 75 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49  ournal && (pageI
21e30 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20  nStatement(pPg) 
21e40 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  || pPager->stmtI
21e50 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nUse==0) ){.    
21e60 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
21e70 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  he = 1;.  }else{
21e80 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67  ..    /* If we g
21e90 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
21ea0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
21eb0 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
21ec0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74      ** written t
21ed0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
21ee0 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
21ef0 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
21f00 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  nal.    ** or bo
21f10 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  th..    **.    *
21f20 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f  * First check to
21f30 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72   see that the tr
21f40 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
21f50 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20  l exists and.   
21f60 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66   ** create it if
21f70 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20   it does not..  
21f80 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
21f90 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
21fa0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
21fb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21fc0 50 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20  PagerBegin(pPg, 
21fd0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
21fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21ff0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22000 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
22010 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
22020 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
22030 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
22040 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
22050 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
22060 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
22070 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
22080 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
22090 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
220a0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
220b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
220c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
220d0 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61  rnalOpen || !pPa
220e0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
220f0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
22100 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
22110 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
22120 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
22130 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
22140 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
22150 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
22160 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
22170 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
22180 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
22190 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
221a0 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
221b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
221c0 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
221d0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
221e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
221f0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
22200 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  & (pPager->useJo
22210 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20  urnal || MEMDB) 
22220 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e  ){.      if( (in
22230 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
22240 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
22250 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
22260 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
22270 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
22280 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
22290 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
222a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  );.          PAG
222b0 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41  ERTRACE3("JOURNA
222c0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
222d0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
222e0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
222f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22300 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20  pHist->pOrig==0 
22310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
22320 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69  st->pOrig = sqli
22330 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67  te3_malloc( pPag
22340 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
22350 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
22360 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
22370 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
22380 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
22390 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
223a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
223b0 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52  st->pOrig, PGHDR
223c0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
223d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
223e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
223f0 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63  .          u32 c
22400 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  ksum;.          
22410 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
22420 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73           /* We s
22430 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
22440 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
22450 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
22460 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
22470 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
22480 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
22490 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
224a0 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
224b0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
224c0 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
224d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
224e0 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
224f0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
22500 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61  );.          pDa
22510 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
22520 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
22530 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
22540 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
22550 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
22560 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
22570 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
22580 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
22590 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
225a0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e  ournalOff, pPg->
225b0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
225c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
225d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
225e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
225f0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
22600 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
22610 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
22640 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
22650 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  + 4);.          
22660 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
22670 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
22680 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20  pageSize+4;.    
22690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
226a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
226b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
226c0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
226d0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
226e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
226f0 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  Off, cksum);.   
22700 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
22710 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34  >journalOff += 4
22720 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22730 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
22740 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
22750 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
22760 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
22770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22780 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22790 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
227a0 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
227b0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
227c0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
227d0 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  j_count);.      
227e0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 35 28      PAGERTRACE5(
227f0 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
22800 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
22810 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
22830 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
22840 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
22850 65 65 64 53 79 6e 63 2c 20 70 61 67 65 72 5f 70  eedSync, pager_p
22860 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 0a  agehash(pPg));..
22870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
22880 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
22890 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  d writing to the
228a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
228b0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  he .          **
228c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
228d0 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
228e0 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
228f0 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ove..          *
22900 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
22910 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22920 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
22930 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
22940 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70    }..          p
22950 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
22960 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
22970 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
22980 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
22990 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
229a0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
229b0 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
229c0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  no);.          p
229d0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
229e0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
229f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
22a00 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
22a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
22a20 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
22a30 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c  pPager->pInStmt,
22a40 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
22a50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22a60 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
22a70 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
22a80 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
22a90 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
22aa0 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
22ab0 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  nc;.        PAGE
22ac0 52 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20  RTRACE4("APPEND 
22ad0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
22ae0 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
22af0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
22b00 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
22b10 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
22b20 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Sync);.      }. 
22b30 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65       if( pPg->ne
22b40 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
22b50 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
22b60 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
22b70 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
22b80 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rnal = 1;.    }.
22b90 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
22ba0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
22bb0 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
22bc0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
22bd0 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
22be0 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
22bf0 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
22c00 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
22c10 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
22c20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
22c30 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
22c40 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
22c50 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
22c60 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
22c70 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
22c80 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
22c90 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
22ca0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
22cb0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
22cc0 65 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65  e .     && !page
22cd0 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29  InStatement(pPg)
22ce0 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74 29 70   .     && (int)p
22cf0 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
22d00 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20  ->stmtSize .    
22d10 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
22d20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
22d30 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
22d40 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
22d50 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Size );.      if
22d60 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
22d70 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
22d80 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
22d90 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
22da0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
22db0 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d  ( pHist->pStmt==
22dc0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  0 );.        pHi
22dd0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69  st->pStmt = sqli
22de0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67  te3_malloc( pPag
22df0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
22e00 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
22e10 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
22e20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
22e30 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52  st->pStmt, PGHDR
22e40 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
22e50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
22e60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22e70 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
22e80 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
22e90 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
22ea0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
22eb0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
22ec0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
22ed0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
22ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22ef0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
22f00 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
22f10 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
22f20 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 63  Size);.        c
22f30 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f  har *pData2 = CO
22f40 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
22f50 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
22f60 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
22f70 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
22f80 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74  er->stfd, offset
22f90 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
22fa0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22fb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22fc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22fd0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
22fe0 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >stfd, pData2, p
22ff0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
23000 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
23010 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
23020 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
23030 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
23040 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
23050 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
23060 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
23070 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23080 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
23090 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
230a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
230b0 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  stmtNRec++;.    
230c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
230d0 65 72 2d 3e 70 49 6e 53 74 6d 74 21 3d 30 20 29  er->pInStmt!=0 )
230e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
230f0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
23100 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d  r->pInStmt, pPg-
23110 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
23120 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
23130 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
23140 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
23150 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  urn..  */.  asse
23160 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
23170 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
23180 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
23190 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
231a0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
231b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
231c0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
231d0 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
231e0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
231f0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
23200 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
23210 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
23220 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
23230 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23240 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
23250 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  on is used to ma
23260 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61  rk a data-page a
23270 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75  s writable. It u
23280 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72  ses .** pager_wr
23290 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20  ite() to open a 
232a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
232b0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
232c0 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20  dy open).** and 
232d0 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a  write the page *
232e0 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75  pData to the jou
232f0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
23300 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
23310 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
23320 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
23330 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
23340 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
23350 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
23360 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
23370 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
23380 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
23390 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
233a0 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
233b0 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
233c0 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
233d0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
233e0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
233f0 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
23400 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
23410 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
23420 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
23430 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23440 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
23450 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
23460 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
23470 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
23480 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
23490 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
234a0 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
234b0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
234c0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
234d0 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44  er);.  if( !MEMD
234e0 42 20 26 26 20 6e 50 61 67 65 50 65 72 53 65 63  B && nPagePerSec
234f0 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
23500 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
23510 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
23520 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
23530 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
23540 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
23550 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23560 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
23570 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
23580 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
23590 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
235a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
235b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
235c0 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
235d0 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
235e0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
235f0 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
23600 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  = 0;..    /* Set
23610 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
23620 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
23630 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
23640 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
23650 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
23660 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
23670 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
23680 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
23690 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
236a0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
236b0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
236c0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  nc==0 );.    pPa
236d0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
236e0 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   1;..    /* This
236f0 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
23700 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
23710 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
23720 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
23730 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
23740 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
23750 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
23760 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
23770 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
23780 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
23790 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
237a0 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
237b0 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
237c0 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
237d0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
237e0 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65   + 1;..    nPage
237f0 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50  Count = sqlite3P
23800 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
23810 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
23820 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
23830 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
23840 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
23850 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
23860 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
23870 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
23880 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
23890 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
238a0 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
238b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
238c0 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
238d0 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
238e0 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
238f0 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
23900 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
23910 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
23920 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
23930 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
23940 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
23950 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
23960 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
23970 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50   pg1+ii;.      P
23980 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
23990 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e     if( pg==pPg->
239a0 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33  pgno || !sqlite3
239b0 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
239c0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
239d0 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  g) ){.        if
239e0 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  ( pg!=PAGER_MJ_P
239f0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
23a00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
23a10 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
23a20 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65  ager, pg, &pPage
23a30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
23a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23a50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
23a60 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
23a70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
23a80 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65     if( pPage->ne
23a90 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
23aa0 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
23ab0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
23ac0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
23ad0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
23ae0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
23af0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
23b00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
23b10 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  (pPage = pager_l
23b20 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
23b30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  )) ){.        if
23b40 28 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e  ( pPage->needSyn
23b50 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  c ){.          n
23b60 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
23b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23b80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
23b90 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
23ba0 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 66  nc flag is set f
23bb0 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50  or any of the nP
23bc0 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a  age pages .    *
23bd0 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  * starting at pg
23be0 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73  1, then it needs
23bf0 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61   to be set for a
23c00 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61  ll of them. Beca
23c10 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69  use.    ** writi
23c20 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ng to any of the
23c30 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d  se nPage pages m
23c40 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74  ay damage the ot
23c50 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a  hers, the.    **
23c60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
23c70 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28  st contain sync(
23c80 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c  )ed copies of al
23c90 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  l of them.    **
23ca0 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74   before any of t
23cb0 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74  hem can be writt
23cc0 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
23cd0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
23ce0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64   */.    if( need
23cf0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 66 6f  Sync ){.      fo
23d00 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
23d10 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20 69 69   && needSync; ii
23d20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  ++){.        PgH
23d30 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65  dr *pPage = page
23d40 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
23d50 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20   pg1+ii);.      
23d60 20 20 69 66 28 20 70 50 61 67 65 20 29 20 70 50    if( pPage ) pP
23d70 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  age->needSync = 
23d80 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
23d90 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
23da0 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d  needSync);.    }
23db0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ..    assert( pP
23dc0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
23dd0 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
23de0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b  ->doNotSync = 0;
23df0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
23e00 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
23e10 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70  DbPage);.  }.  p
23e20 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
23e30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
23e40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23e50 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
23e60 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
23e70 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
23e80 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
23e90 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
23ea0 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
23eb0 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
23ec0 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
23ed0 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
23ee0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
23ef0 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
23f00 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
23f10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
23f20 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
23f30 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
23f40 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66  >dirty;.}.#endif
23f50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23f60 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a  _OMIT_VACUUM./*.
23f70 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63  ** Replace the c
23f80 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67  ontent of a sing
23f90 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65  le page with the
23fa0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
23fb0 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67  the third.** arg
23fc0 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
23fd0 6c 69 74 65 33 50 61 67 65 72 4f 76 65 72 77 72  lite3PagerOverwr
23fe0 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
23ff0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f  r, Pgno pgno, vo
24000 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
24010 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
24020 72 63 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65  rc;..  pagerEnte
24030 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  r(pPager);.  rc 
24040 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
24050 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
24060 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 3d  &pPg);.  if( rc=
24070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
24090 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20  gerWrite(pPg);. 
240a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
240b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65  E_OK ){.      me
240c0 6d 63 70 79 28 73 71 6c 69 74 65 33 50 61 67 65  mcpy(sqlite3Page
240d0 72 47 65 74 44 61 74 61 28 70 50 67 29 2c 20 70  rGetData(pPg), p
240e0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
240f0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
24100 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
24110 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  nref(pPg);.  }. 
24120 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
24130 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
24140 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
24150 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
24160 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
24170 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
24180 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
24190 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
241a0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
241b0 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
241c0 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
241d0 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
241e0 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
241f0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a  rked as dirty..*
24200 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
24210 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
24220 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
24230 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
24240 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
24250 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
24260 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70  s unused.  The p
24270 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
24280 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
24290 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
242a0 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
242b0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
242c0 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
242d0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
242e0 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  , together with 
242f0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  the.** sqlite3Pa
24300 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
24310 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68  ) below, more th
24320 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70  an double the sp
24330 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20  eed.** of large 
24340 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
24350 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20  s and quadruple 
24360 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
24370 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a  ge DELETEs..**.*
24380 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
24390 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
243a0 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c  et the alwaysRol
243b0 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72  lback flag to tr
243c0 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ue..** Subsequen
243d0 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
243e0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
243f0 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
24400 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
24410 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
24420 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
24430 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
24440 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
24450 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
24460 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
24470 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
24480 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
24490 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
244a0 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
244b0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
244c0 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
244d0 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
244e0 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
244f0 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
24500 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
24510 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
24520 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
24530 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
24540 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
24550 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
24560 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71  eused,.** the sq
24570 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
24580 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  llback() routine
24590 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74   is called.  But
245a0 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
245b0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72  page contains cr
245c0 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20  itical data, we 
245d0 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65  still need to be
245e0 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a   sure it gets.**
245f0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
24600 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c  spite of the sql
24610 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
24620 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f  lback() call..*/
24630 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
24640 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61  erDontWrite(DbPa
24650 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
24660 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
24670 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
24680 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
24690 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  ger;..  if( MEMD
246a0 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 61  B ) return;.  pa
246b0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
246c0 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  ;.  pPg->alwaysR
246d0 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69  ollback = 1;.  i
246e0 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26  f( pPg->dirty &&
246f0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
24700 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Use ){.    asser
24710 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
24720 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
24730 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
24740 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70  ->dbSize==(int)p
24750 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67  Pg->pgno && pPag
24760 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70  er->origDbSize<p
24770 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
24780 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
24790 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c  s pages is the l
247a0 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
247b0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
247c0 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20  e has grown.    
247d0 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
247e0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
247f0 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54  ion, then do NOT
24800 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
24810 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a  s clean..      *
24820 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62  * When the datab
24830 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20  ase file grows, 
24840 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72  we must make sur
24850 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  e that the last 
24860 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65  page.      ** ge
24870 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65  ts written at le
24880 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74  ast once so that
24890 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77   the disk file w
248a0 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65  ill be the corre
248b0 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65  ct.      ** size
248c0 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  . If you do not 
248d0 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20  write this page 
248e0 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
248f0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
24900 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e  * on the disk en
24910 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20  ds up being too 
24920 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20  small, that can 
24930 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
24940 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  .      ** corrup
24950 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tion during the 
24960 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
24970 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
24980 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
24990 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52  RTRACE3("DONT_WR
249a0 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
249b0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
249c0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
249d0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
249e0 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e  (("CLEAN %p %d\n
249f0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
24a00 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b  pgno)).      mak
24a10 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66  eClean(pPg);.#if
24a20 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
24a30 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
24a40 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
24a50 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
24a60 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
24a70 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
24a80 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
24a90 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
24aa0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
24ab0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
24ac0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
24ad0 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
24ae0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
24af0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
24b00 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
24b10 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
24b20 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
24b30 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
24b40 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
24b50 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
24b60 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
24b70 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68  l..**.** If we h
24b80 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75  ave not yet actu
24b90 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f  ally read the co
24ba0 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61  ntent of this pa
24bb0 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67  ge (if.** the Pg
24bc0 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61  Hdr.needRead fla
24bd0 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 74  g is set) then t
24be0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
24bf0 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a   as a promise.**
24c00 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65   that we will ne
24c10 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64  ver need to read
24c20 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
24c30 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
24c40 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52  .** so the needR
24c50 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20  ead flag can be 
24c60 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73 20  cleared at this 
24c70 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
24c80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
24c90 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20  y called from a 
24ca0 73 69 6e 67 6c 65 20 70 6c 61 63 65 20 69 6e 20  single place in 
24cb0 74 68 65 20 73 71 6c 69 74 65 20 62 74 72 65 65  the sqlite btree
24cc0 0a 2a 2a 20 63 6f 64 65 20 28 77 68 65 6e 20 61  .** code (when a
24cd0 20 6c 65 61 66 20 69 73 20 72 65 6d 6f 76 65 64   leaf is removed
24ce0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
24cf0 69 73 74 29 2e 20 54 68 69 73 20 61 6c 6c 6f 77  ist). This allow
24d00 73 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  s the.** followi
24d10 6e 67 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 74  ng assumptions t
24d20 6f 20 62 65 20 6d 61 64 65 20 61 62 6f 75 74 20  o be made about 
24d30 70 50 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  pPg:.**.**   1. 
24d40 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29  PagerDontWrite()
24d50 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
24d60 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 4f 52   on the page, OR
24d70 20 0a 2a 2a 20 20 20 20 20 20 50 61 67 65 72 57   .**      PagerW
24d80 72 69 74 65 28 29 20 68 61 73 20 6e 6f 74 20 79  rite() has not y
24d90 65 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  et been called o
24da0 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
24db0 2a 20 20 20 32 2e 20 54 68 65 20 70 61 67 65 20  *   2. The page 
24dc0 65 78 69 73 74 65 64 20 77 68 65 6e 20 74 68 65  existed when the
24dd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
24de0 20 73 74 61 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   started..**.** 
24df0 44 65 74 61 69 6c 73 3a 20 44 6f 6e 74 52 6f 6c  Details: DontRol
24e00 6c 62 61 63 6b 28 29 20 28 74 68 69 73 20 72 6f  lback() (this ro
24e10 75 74 69 6e 65 29 20 69 73 20 6f 6e 6c 79 20 63  utine) is only c
24e20 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6c 65 61  alled when a lea
24e30 66 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 20  f is.** removed 
24e40 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
24e50 73 74 2e 20 44 6f 6e 74 57 72 69 74 65 28 29 20  st. DontWrite() 
24e60 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76  is called whenev
24e70 65 72 20 61 20 70 61 67 65 20 0a 2a 2a 20 62 65  er a page .** be
24e80 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
24e90 74 20 6c 65 61 66 2e 0a 2a 2f 0a 76 6f 69 64 20  t leaf..*/.void 
24ea0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
24eb0 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20  Rollback(DbPage 
24ec0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
24ed0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
24ee0 61 67 65 72 3b 0a 0a 20 20 70 61 67 65 72 45 6e  ager;..  pagerEn
24ef0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61  ter(pPager);.  a
24f00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
24f10 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
24f20 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  RVED );..  /* If
24f30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
24f40 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
24f50 72 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61  r DontWrite() ha
24f60 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  s been called on
24f70 0a 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20  .  ** this page 
24f80 28 44 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74  (DontWrite() set
24f90 73 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  s the alwaysRoll
24fa0 62 61 63 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e  back flag), then
24fb0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
24fc0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
24fd0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
24fe0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
24ff0 30 20 7c 7c 20 70 50 67 2d 3e 61 6c 77 61 79 73  0 || pPg->always
25000 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
25010 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
25020 63 6b 20 29 7b 0a 20 20 20 20 70 61 67 65 72 4c  ck ){.    pagerL
25030 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
25040 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
25050 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
25060 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 6d 65  ;    /* For a me
25070 6d 64 62 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  mdb, pPager->jou
25080 72 6e 61 6c 4f 70 65 6e 20 69 73 20 61 6c 77 61  rnalOpen is alwa
25090 79 73 20 30 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  ys 0 */..  /* Ch
250a0 65 63 6b 20 74 68 61 74 20 50 61 67 65 72 57 72  eck that PagerWr
250b0 69 74 65 28 29 20 68 61 73 20 6e 6f 74 20 79 65  ite() has not ye
250c0 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  t been called on
250d0 20 74 68 69 73 20 70 61 67 65 2c 20 61 6e 64 0a   this page, and.
250e0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61    ** that the pa
250f0 67 65 20 65 78 69 73 74 65 64 20 77 68 65 6e 20  ge existed when 
25100 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
25110 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  started..  */.  
25120 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 69 6e  assert( !pPg->in
25130 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
25140 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
25150 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
25160 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
25170 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
25180 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
25190 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
251a0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
251b0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d  g->pgno);.  pPg-
251c0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
251d0 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20    pPg->needRead 
251e0 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
251f0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
25200 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
25210 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3c 3d 20  er->stmtSize <= 
25220 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
25230 7a 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ze );.    sqlite
25240 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
25250 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d  r->pInStmt, pPg-
25260 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 50 41  >pgno);.  }.  PA
25270 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f  GERTRACE3("DONT_
25280 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64  ROLLBACK page %d
25290 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
252a0 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
252b0 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43  ager));.  IOTRAC
252c0 45 28 28 22 47 41 52 42 41 47 45 20 25 70 20 25  E(("GARBAGE %p %
252d0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
252e0 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 70 61 67 65  g->pgno)).  page
252f0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
25300 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
25310 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
25320 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
25330 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25340 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a  change-counter,.
25350 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74  ** stored at byt
25360 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  e 24 of the page
25370 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  r file..*/.stati
25380 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
25390 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
253a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
253b0 74 20 69 73 44 69 72 65 63 74 29 7b 0a 20 20 50  t isDirect){.  P
253c0 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
253d0 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
253e0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
253f0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
25400 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65   !pPager->change
25410 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20  CountDone ){.   
25420 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
25430 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
25440 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  writing. */.    
25450 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
25460 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
25470 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
25480 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25490 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
254a0 20 20 69 66 28 20 21 69 73 44 69 72 65 63 74 20    if( !isDirect 
254b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
254c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
254d0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 69  pPgHdr);.      i
254e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
254f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
25500 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
25510 67 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 72  gHdr);.        r
25520 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
25530 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
25540 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
25550 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
25560 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
25570 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
25580 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
25590 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
255a0 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d  yte((u8*)pPager-
255b0 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20  >dbFileVers);.  
255c0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
255d0 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ++;.    put32bit
255e0 73 28 28 28 63 68 61 72 2a 29 50 47 48 44 52 5f  s(((char*)PGHDR_
255f0 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29 29  TO_DATA(pPgHdr))
25600 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
25610 74 65 72 29 3b 0a 0a 20 20 20 20 69 66 28 20 69  ter);..    if( i
25620 73 44 69 72 65 63 74 20 26 26 20 70 50 61 67 65  sDirect && pPage
25630 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
25640 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 76  ){.      const v
25650 6f 69 64 20 2a 7a 42 75 66 20 3d 20 50 47 48 44  oid *zBuf = PGHD
25660 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72  R_TO_DATA(pPgHdr
25670 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
25680 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
25690 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70  ger->fd, zBuf, p
256a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
256b0 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
256c0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
256d0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
256e0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  /.    sqlite3Pag
256f0 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
25700 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
25710 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
25720 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
25730 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
25740 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25750 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
25760 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
25770 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
25780 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
25790 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
257a0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
257b0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
257c0 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
257d0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
257e0 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
257f0 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
25800 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
25810 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
25820 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
25830 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
25840 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
25850 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  e ensures that t
25860 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
25870 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20  nced, all dirty 
25880 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a  pages written.**
25890 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
258a0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61   file and the da
258b0 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63  tabase file sync
258c0 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  ed. The only thi
258d0 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69  ng that.** remai
258e0 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
258f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
25900 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
25910 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a  urnal file (or.*
25920 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
25930 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
25940 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
25950 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
25960 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
25970 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
25980 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
25990 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
259a0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
259b0 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
259c0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  l..**.** If para
259d0 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20  meter nTrunc is 
259e0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
259f0 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73  he pager file is
25a00 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a   truncated to.**
25a10 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28 74   nTrunc pages (t
25a20 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 61  his is used by a
25a30 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
25a40 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ases)..*/.int sq
25a50 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
25a60 50 68 61 73 65 4f 6e 65 28 50 61 67 65 72 20 2a  PhaseOne(Pager *
25a70 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
25a80 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e  ar *zMaster, Pgn
25a90 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74  o nTrunc){.  int
25aa0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25ab0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28  ..  PAGERTRACE4(
25ac0 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
25ad0 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
25ae0 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c  %s nTrunc=%d\n",
25af0 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
25b00 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74  zFilename, zMast
25b10 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 70  er, nTrunc);.  p
25b20 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
25b30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
25b40 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
25b50 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
25b60 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
25b70 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
25b80 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
25b90 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
25ba0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
25bb0 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
25bc0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
25bd0 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21  AGER_SYNCED && !
25be0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
25bf0 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20  >dirtyCache ){. 
25c00 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a     PgHdr *pPg;..
25c10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
25c20 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
25c30 45 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74 6f  E.    /* The ato
25c40 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
25c50 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
25c60 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
25c70 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
25c80 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
25c90 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  **.    **    + T
25ca0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
25cb0 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d  upports the atom
25cc0 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
25cd0 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20  y for.    **    
25ce0 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65    blocks of size
25cf0 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a   page-size, and.
25d00 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 69 73      **    + This
25d10 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70   commit is not p
25d20 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
25d30 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ile transaction,
25d40 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b   and.    **    +
25d50 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   Exactly one pag
25d60 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
25d70 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  ied and store in
25d80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25d90 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
25da0 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
25db0 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
25dc0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
25dd0 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76  al file will nev
25de0 65 72 0a 20 20 20 20 2a 2a 20 62 65 20 63 72 65  er.    ** be cre
25df0 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72  ated for this tr
25e00 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a  ansaction..    *
25e10 2f 0a 20 20 20 20 69 6e 74 20 75 73 65 41 74 6f  /.    int useAto
25e20 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20 20  micWrite = (.   
25e30 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26 26       !zMaster &&
25e40 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
25e50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72  ->journalOff==jr
25e60 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
25e70 67 65 72 29 20 26 26 20 0a 20 20 20 20 20 20 20  ger) && .       
25e80 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a 20   nTrunc==0 && . 
25e90 20 20 20 20 20 20 20 28 30 3d 3d 70 50 61 67 65         (0==pPage
25ea0 72 2d 3e 70 44 69 72 74 79 20 7c 7c 20 30 3d 3d  r->pDirty || 0==
25eb0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e  pPager->pDirty->
25ec0 70 44 69 72 74 79 29 0a 20 20 20 20 29 3b 0a 20  pDirty).    );. 
25ed0 20 20 20 69 66 28 20 75 73 65 41 74 6f 6d 69 63     if( useAtomic
25ee0 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  Write ){.      /
25ef0 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e 52 65  * Update the nRe
25f00 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6a  c field in the j
25f10 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
25f20 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73 65 74        int offset
25f30 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
25f40 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61  alHdr + sizeof(a
25f50 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20  JournalMagic);. 
25f60 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
25f70 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20 20  er->nRec==1);.  
25f80 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
25f90 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
25fa0 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67 65 72  , offset, pPager
25fb0 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
25fc0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62  /* Update the db
25fd0 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75   file change cou
25fe0 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  nter. The follow
25ff0 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f  ing call will mo
26000 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  dify.      ** th
26010 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
26020 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61  esentation of pa
26030 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64 65 20  ge 1 to include 
26040 74 68 65 20 75 70 64 61 74 65 64 0a 20 20 20 20  the updated.    
26050 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e    ** change coun
26060 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69  ter and then wri
26070 74 65 20 70 61 67 65 20 31 20 64 69 72 65 63 74  te page 1 direct
26080 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ly to the databa
26090 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  se.      ** file
260a0 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65  . Because of the
260b0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
260c0 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f  operty of the ho
260d0 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  st file-system, 
260e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69  .      ** this i
260f0 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f  s safe..      */
26100 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
26110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26120 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
26130 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
26140 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  r(pPager, 1);.  
26150 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
26160 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26170 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65  te3JournalCreate
26180 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
26190 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 75     }..    if( !u
261a0 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 26 26  seAtomicWrite &&
261b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
261c0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
261d0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
261e0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
261f0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
26200 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20  ritten to the.  
26210 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
26220 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20  e, then no sync 
26230 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  is required. Thi
26240 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69  s happens when i
26250 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74  t is.    ** writ
26260 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72  ten, then the pr
26270 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75  ocess fails to u
26280 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
26290 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20  SERVED to an.   
262a0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
262b0 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d  ck. The next tim
262c0 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72  e the process tr
262d0 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ies to commit th
262e0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
262f0 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d  tion the m-j nam
26300 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
26310 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
26320 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
26330 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
26340 74 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ter ){.      ass
26350 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
26360 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
26370 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
26380 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
26390 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
263a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
263b0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
263c0 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51  exit;.#ifndef SQ
263d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
263e0 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e  CUUM.      if( n
263f0 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
26400 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
26410 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
26420 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
26430 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
26440 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20  ll pages.       
26450 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72   ** being discar
26460 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63  ded by the trunc
26470 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72  ation must be wr
26480 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
26490 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
264a0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
264b0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b  .        Pgno i;
264c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b  .        int iSk
264d0 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47  ip = PAGER_MJ_PG
264e0 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  NO(pPager);.    
264f0 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e      for( i=nTrun
26500 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e  c+1; i<=pPager->
26510 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20  origDbSize; i++ 
26520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
26530 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
26540 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
26550 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21  ournal, i) && i!
26560 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
26570 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26580 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
26590 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, i, &pPg);.   
265a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
265b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
265c0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
265d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
265e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
265f0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
26600 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
26610 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
26620 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26630 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
26640 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
26650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
26660 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
26670 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
26680 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
26690 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
266a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
266b0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
266c0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
266d0 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
266e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
266f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26700 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
26710 63 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66  c_exit;..#ifndef
26720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26730 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
26740 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
26750 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
26760 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61  agerTruncate(pPa
26770 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ger, nTrunc);.  
26780 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26790 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
267a0 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65  c_exit;.    }.#e
267b0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69  ndif..    /* Wri
267c0 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  te all dirty pag
267d0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
267e0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70  se file */.    p
267f0 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
26800 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
26810 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  Pager);.    rc =
26820 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
26830 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
26840 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26850 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
26860 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  t( rc!=SQLITE_IO
26870 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20  ERR_BLOCKED );. 
26880 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f       /* The erro
26890 72 20 6d 69 67 68 74 20 68 61 76 65 20 6c 65 66  r might have lef
268a0 74 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74  t the dirty list
268b0 20 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70 20 68   all fouled up h
268c0 65 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20 62 75  ere,.      ** bu
268d0 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  t that does not 
268e0 6d 61 74 74 65 72 20 62 65 63 61 75 73 65 20 69  matter because i
268f0 66 20 74 68 65 20 69 66 20 74 68 65 20 64 69 72  f the if the dir
26900 74 79 20 6c 69 73 74 20 64 69 64 0a 20 20 20 20  ty list did.    
26910 20 20 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74    ** get corrupt
26920 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74 72 61  ed, then the tra
26930 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 6f  nsaction will ro
26940 6c 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20 20 20  ll back and.    
26950 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65    ** discard the
26960 20 64 69 72 74 79 20 6c 69 73 74 2e 20 20 54 68   dirty list.  Th
26970 65 72 65 20 69 73 20 61 6e 20 61 73 73 65 72 74  ere is an assert
26980 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67   in.      ** pag
26990 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
269a0 5f 70 61 67 65 73 28 29 20 74 68 61 74 20 76 65  _pages() that ve
269b0 72 69 66 69 65 73 20 74 68 61 74 20 6e 6f 20 61  rifies that no a
269c0 74 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20  ttempt.      ** 
269d0 69 73 20 6d 61 64 65 20 74 6f 20 75 73 65 20 61  is made to use a
269e0 6e 20 69 6e 76 61 6c 69 64 20 64 69 72 74 79 20  n invalid dirty 
269f0 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  list..      */. 
26a00 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65       goto sync_e
26a10 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  xit;.    }.    p
26a20 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
26a30 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  0;..    /* Sync 
26a40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26a50 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  e. */.    if( !p
26a60 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
26a70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26a80 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
26a90 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
26aa0 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  nc_flags);.    }
26ab0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
26ac0 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
26ad0 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65  ger))..    pPage
26ae0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
26af0 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65  _SYNCED;.  }else
26b00 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54   if( MEMDB && nT
26b10 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  runc!=0 ){.    r
26b20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26b30 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  Truncate(pPager,
26b40 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73   nTrunc);.  }..s
26b50 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28 20  ync_exit:.  if( 
26b60 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
26b70 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  _BLOCKED ){.    
26b80 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  /* pager_incr_ch
26b90 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61  angecounter() ma
26ba0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  y attempt to obt
26bb0 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ain an exclusive
26bc0 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20  .     * lock to 
26bd0 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
26be0 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52  and return IOERR
26bf0 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69  _BLOCKED. But si
26c00 6e 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65 72  nce .     * ther
26c10 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
26c20 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f  he cache is inco
26c30 6e 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73 0a  nsistent, it is.
26c40 20 20 20 20 20 2a 20 62 65 74 74 65 72 20 74 6f       * better to
26c50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
26c60 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  USY..     */.   
26c70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
26c80 59 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65  Y;.  }.  pagerLe
26c90 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
26ca0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
26cb0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
26cc0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
26cd0 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61  tabase and relea
26ce0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
26cf0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
26d00 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72  commit fails for
26d10 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72   any reason, a r
26d20 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20  ollback attempt 
26d30 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61  is made.** and a
26d40 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
26d50 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68  returned.  If th
26d60 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c  e commit worked,
26d70 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
26d80 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
26d90 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
26da0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67  mmitPhaseTwo(Pag
26db0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
26dc0 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
26dd0 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  pPg;..  if( pPag
26de0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
26df0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
26e00 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
26e10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
26e20 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
26e30 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
26e40 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
26e50 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  }.  pagerEnter(p
26e60 50 61 67 65 72 29 3b 0a 20 20 50 41 47 45 52 54  Pager);.  PAGERT
26e70 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64  RACE2("COMMIT %d
26e80 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
26e90 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
26ea0 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  DB ){.    pPg = 
26eb0 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
26ec0 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
26ed0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50  );.    while( pP
26ee0 67 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  g ){.      PgHis
26ef0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
26f00 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
26f10 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
26f20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
26f30 73 74 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  st);.      pPg->
26f40 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
26f50 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
26f60 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74  = 0;.      pHist
26f70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
26f80 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
26f90 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69  c = 0;.      pHi
26fa0 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  st->pPrevStmt = 
26fb0 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
26fc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20   = 0;.      pPg 
26fd0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
26fe0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
26ff0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66  >pDirty = 0;.#if
27000 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
27010 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
27020 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
27030 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
27040 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
27050 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
27060 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
27070 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
27080 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  ( !pPg->alwaysRo
27090 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
270a0 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
270b0 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61  pOrig );.      a
270c0 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
270d0 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65  Stmt );.    }.#e
270e0 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d  ndif.    pPager-
270f0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
27100 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
27110 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
27120 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
27130 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
27140 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
27150 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27160 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
27170 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
27180 61 63 68 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ache );.  assert
27190 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
271a0 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c  =PAGER_SYNCED ||
271b0 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
271c0 61 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70  ache );.  rc = p
271d0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
271e0 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
271f0 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
27200 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
27210 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
27220 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
27230 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
27240 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
27250 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
27260 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
27270 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
27280 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
27290 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
272a0 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
272b0 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
272c0 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
272d0 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
272e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
272f0 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
27300 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
27310 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
27320 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
27330 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
27340 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65  protocol or unle
27350 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  ss some other.**
27360 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
27370 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74  ing trash into t
27380 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27390 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29  (SQLITE_CORRUPT)
273a0 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20   or.** unless a 
273b0 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66  prior malloc() f
273c0 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f  ailed (SQLITE_NO
273d0 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61  MEM).  Appropria
273e0 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
273f0 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66  s are returned f
27400 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63  or all these occ
27410 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69  asions.  Otherwi
27420 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  se,.** SQLITE_OK
27430 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
27440 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
27450 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  rRollback(Pager 
27460 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
27470 72 63 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  rc;.  PAGERTRACE
27480 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  2("ROLLBACK %d\n
27490 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
274a0 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
274b0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
274c0 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67  ;.    for(p=pPag
274d0 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
274e0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
274f0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
27500 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ist;.      asser
27510 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c  t( !p->alwaysRol
27520 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  lback );.      i
27530 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a  f( !p->dirty ){.
27540 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27550 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
27560 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
27570 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20  pPager))->pOrig 
27580 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
27590 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
275a0 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
275b0 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74  p, pPager))->pSt
275c0 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  mt );.        co
275d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
275e0 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50  .      pHist = P
275f0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
27600 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
27610 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
27620 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
27630 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
27640 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  p), pHist->pOrig
27650 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
27660 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  ze);.        PAG
27670 45 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41  ERTRACE3("ROLLBA
27680 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64  CK-PAGE %d of %d
27690 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41  \n", p->pgno, PA
276a0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
276b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
276c0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
276d0 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65  ("PAGE %d is cle
276e0 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e  an on %d\n", p->
276f0 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
27700 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ager));.      }.
27710 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
27720 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20  ry(pHist);.     
27730 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20   p->dirty = 0;. 
27740 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61       p->inJourna
27750 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69  l = 0;.      pHi
27760 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  st->inStmt = 0;.
27770 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72        pHist->pPr
27780 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e  evStmt = pHist->
27790 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
277a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
277b0 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
277c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
277d0 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65  einiter(p, pPage
277e0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
277f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27800 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
27810 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
27820 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
27830 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
27840 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
27850 7a 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72  ze;.    pager_tr
27860 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
27870 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
27880 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
27890 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
278a0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
278b0 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
278c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
278d0 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
278e0 72 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  r);.  if( !pPage
278f0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c  r->dirtyCache ||
27900 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
27910 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
27920 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
27930 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
27940 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
27950 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
27960 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
27970 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
27980 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
27990 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
279a0 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
279b0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
279c0 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
279d0 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
279e0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
279f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
27a00 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
27a10 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
27a20 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
27a30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
27a40 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
27a50 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ED ){.    int rc
27a60 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  2;.    rc = page
27a70 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
27a80 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d  r, 0);.    rc2 =
27a90 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
27aa0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
27ab0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27ac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
27ad0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20  c = rc2;.    }. 
27ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
27af0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
27b00 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a  pPager, 0);.  }.
27b10 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74    /* pager_reset
27b20 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70  (pPager); */.  p
27b30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
27b40 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  -1;..  /* If an 
27b50 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
27b60 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20  ing a ROLLBACK, 
27b70 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  we can no longer
27b80 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72   trust the pager
27b90 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20  .  ** cache. So 
27ba0 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72  call pager_error
27bb0 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75  () on the way ou
27bc0 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72  t to make any er
27bd0 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73  ror .  ** persis
27be0 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tent..  */.  rc 
27bf0 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
27c00 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67  ager, rc);.  pag
27c10 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
27c20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27c30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
27c40 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
27c50 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
27c60 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
27c70 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
27c80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
27c90 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
27ca0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
27cb0 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
27cc0 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
27cd0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
27ce0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
27cf0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
27d00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
27d10 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
27d20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
27d30 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
27d40 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
27d50 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
27d60 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66  er->nRef;.}..#if
27d70 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
27d80 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
27d90 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
27da0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
27db0 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
27dc0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74   *sqlite3PagerSt
27dd0 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
27de0 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
27df0 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
27e00 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20   pPager->nRef;. 
27e10 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[1] = pPager->
27e20 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20  nPage;.  a[2] = 
27e30 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a  pPager->mxPage;.
27e40 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
27e50 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20  >dbSize;.  a[4] 
27e60 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
27e70 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
27e80 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
27e90 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
27ea0 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
27eb0 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
27ec0 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
27ed0 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
27ee0 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
27ef0 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
27f00 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
27f10 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
27f20 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   a;.}.#endif../*
27f30 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74  .** Set the stat
27f40 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70  ement rollback p
27f50 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
27f60 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
27f70 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
27f80 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
27f90 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
27fa0 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73  * open.  A new s
27fb0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
27fc0 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
27fd0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
27fe0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
27ff0 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
28000 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
28010 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
28020 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
28030 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 6d 74  ic int pagerStmt
28040 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
28050 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
28060 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
28070 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
28080 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28090 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
280a0 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72  HARED );.  asser
280b0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
280c0 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  e>=0 );.  PAGERT
280d0 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49  RACE2("STMT-BEGI
280e0 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
280f0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
28100 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
28110 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
28120 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
28130 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
28140 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
28150 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28160 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
28170 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
28180 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
28190 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  stmtAutoopen = 1
281a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
281b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
281c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
281d0 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70  urnalOpen );.  p
281e0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
281f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
28200 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20  ger->pInStmt==0 
28210 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
28220 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 42 69  Stmt = sqlite3Bi
28230 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
28240 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61  r->dbSize);.  pa
28250 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
28260 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
28270 70 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  pInStmt==0 ){.  
28280 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f    /* sqlite3OsLo
28290 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
282a0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a  HARED_LOCK); */.
282b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
282c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66  E_NOMEM;.  }.#if
282d0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63  ndef NDEBUG.  rc
282e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
282f0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
28300 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  , &pPager->stmtJ
28310 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
28320 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
28330 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65  n_failed;.  asse
28340 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
28350 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d  JSize == pPager-
28360 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23  >journalOff );.#
28370 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e  endif.  pPager->
28380 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67  stmtJSize = pPag
28390 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
283a0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
283b0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
283c0 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ize;.  pPager->s
283d0 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20  tmtHdrOff = 0;. 
283e0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
283f0 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
28400 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70  umInit;.  if( !p
28410 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
28420 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
28430 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
28440 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
28450 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 50 61  Pager->stfd, pPa
28460 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 2c 0a  ger->zStmtJrnl,.
28470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
28490 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
284a0 52 4e 41 4c 29 3b 0a 20 20 20 20 69 66 28 20 72  RNAL);.    if( r
284b0 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  c ){.      goto 
284c0 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
284d0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  d;.    }.    pPa
284e0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
284f0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
28500 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  tmtNRec = 0;.  }
28510 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  .  pPager->stmtI
28520 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75  nUse = 1;.  retu
28530 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a  rn SQLITE_OK;. .
28540 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
28550 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  d:.  if( pPager-
28560 3e 70 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20  >pInStmt ){.    
28570 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
28580 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
28590 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65  Stmt);.    pPage
285a0 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->pInStmt = 0;.
285b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
285c0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  .}.int sqlite3Pa
285d0 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67  gerStmtBegin(Pag
285e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
285f0 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e  nt rc;.  pagerEn
28600 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
28610 63 20 3d 20 70 61 67 65 72 53 74 6d 74 42 65 67  c = pagerStmtBeg
28620 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  in(pPager);.  pa
28630 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
28640 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
28650 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
28660 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
28670 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
28680 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20  tmtCommit(Pager 
28690 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 61 67 65  *pPager){.  page
286a0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
286b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
286c0 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
286d0 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
286e0 74 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  t;.    PAGERTRAC
286f0 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20  E2("STMT-COMMIT 
28700 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28710 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
28720 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
28730 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75   /* sqlite3OsTru
28740 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74  ncate(pPager->st
28750 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fd, 0); */.     
28760 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
28770 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
28780 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 70 50  nStmt);.      pP
28790 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20  ager->pInStmt = 
287a0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
287b0 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
287c0 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
287d0 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
287e0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
287f0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
28800 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
28810 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74  );.        pNext
28820 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
28830 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  tmt;.        ass
28840 65 72 74 28 20 70 48 69 73 74 2d 3e 69 6e 53 74  ert( pHist->inSt
28850 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48  mt );.        pH
28860 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  ist->inStmt = 0;
28870 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
28880 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73  pPrevStmt = pHis
28890 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  t->pNextStmt = 0
288a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
288b0 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53  3_free(pHist->pS
288c0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48  tmt);.        pH
288d0 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
288e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
288f0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
28900 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ec = 0;.    pPag
28910 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
28920 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
28930 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
28940 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
28950 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65  open = 0;.  page
28960 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
28970 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28980 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  OK;.}../*.** Rol
28990 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e  lback a statemen
289a0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
289b0 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61  3PagerStmtRollba
289c0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
289d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  ){.  int rc;.  p
289e0 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
289f0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
28a00 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
28a10 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
28a20 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  TMT-ROLLBACK %d\
28a30 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
28a40 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  er));.    if( ME
28a50 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48  MDB ){.      PgH
28a60 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 50  dr *pPg;.      P
28a70 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b  gHistory *pHist;
28a80 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
28a90 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
28aa0 67 3b 20 70 50 67 3d 70 48 69 73 74 2d 3e 70 4e  g; pPg=pHist->pN
28ab0 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20  extStmt){.      
28ac0 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f    pHist = PGHDR_
28ad0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
28ae0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
28af0 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
28b00 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
28b10 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
28b20 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53  (pPg), pHist->pS
28b30 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  tmt, pPager->pag
28b40 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
28b50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
28b60 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
28b70 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
28b80 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
28b90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28ba0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
28bb0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
28bc0 69 7a 65 3b 0a 20 20 20 20 20 20 70 61 67 65 72  ize;.      pager
28bd0 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
28be0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
28bf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
28c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28c10 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f  rc = pager_stmt_
28c20 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
28c30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
28c40 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
28c50 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  it(pPager);.  }e
28c60 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
28c70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
28c80 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
28c90 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  pen = 0;.  pager
28ca0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
28cb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28cc0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
28cd0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
28ce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28cf0 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
28d00 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  r *sqlite3PagerF
28d10 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
28d20 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
28d30 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
28d40 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
28d50 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75  urn the VFS stru
28d60 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61  cture for the pa
28d70 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71  ger..*/.const sq
28d80 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74  lite3_vfs *sqlit
28d90 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72  e3PagerVfs(Pager
28da0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
28db0 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73  urn pPager->pVfs
28dc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
28dd0 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  n the file handl
28de0 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  e for the databa
28df0 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
28e00 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70  ed.** with the p
28e10 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  ager.  This migh
28e20 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  t return NULL if
28e30 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a   the file has.**
28e40 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
28e50 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ened..*/.sqlite3
28e60 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61  _file *sqlite3Pa
28e70 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70  gerFile(Pager *p
28e80 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
28e90 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a   pPager->fd;.}..
28ea0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
28eb0 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
28ec0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
28ed0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
28ee0 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e  sqlite3PagerDirn
28ef0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
28f00 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
28f10 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b  ger->zDirectory;
28f20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
28f30 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
28f40 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
28f50 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  l file..*/.const
28f60 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
28f70 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50  gerJournalname(P
28f80 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
28f90 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
28fa0 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  zJournal;.}../*.
28fb0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
28fc0 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20  f fsync() calls 
28fd0 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72  are disabled for
28fe0 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65   this pager.  Re
28ff0 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
29000 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78   fsync()s are ex
29010 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e  ecuted normally.
29020 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
29030 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72  agerNosync(Pager
29040 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
29050 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  urn pPager->noSy
29060 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  nc;.}..#ifdef SQ
29070 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f  LITE_HAS_CODEC./
29080 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
29090 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
290a0 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
290b0 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a  3PagerSetCodec(.
290c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
290d0 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
290e0 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
290f0 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
29100 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20   *pCodecArg.){. 
29110 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20   pPager->xCodec 
29120 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  = xCodec;.  pPag
29130 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20  er->pCodecArg = 
29140 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e  pCodecArg;.}.#en
29150 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
29160 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
29170 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  UUM./*.** Move t
29180 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c  he page pPg to l
29190 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20  ocation pgno in 
291a0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
291b0 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
291c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
291d0 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
291e0 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a  ly located at.**
291f0 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20   pgno (which we 
29200 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f  call pPgOld) tho
29210 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73  ugh that page is
29220 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a   allowed to be.*
29230 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20  * in cache.  If 
29240 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
29250 73 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e  s located at pgn
29260 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  o is not already
29270 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  .** in the rollb
29280 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ack journal, it 
29290 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65  is not put there
292a0 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74   by by this rout
292b0 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72  ine..**.** Refer
292c0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
292d0 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c  e pPg remain val
292e0 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79  id. Updating any
292f0 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73  .** meta-data as
29300 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
29310 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f  g (i.e. data sto
29320 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72  red in the nExtr
29330 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63  a bytes.** alloc
29340 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
29350 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65  the page) is the
29360 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
29370 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  of the caller..*
29380 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69  *.** A transacti
29390 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  on must be activ
293a0 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
293b0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49  ine is called. I
293c0 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20  t used to be.** 
293d0 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20  required that a 
293e0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
293f0 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63  ction was not ac
29400 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72  tive, but this r
29410 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61  estriction.** ha
29420 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28  s been removed (
29430 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65  CREATE INDEX nee
29440 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67  ds to move a pag
29450 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65  e when a stateme
29460 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
29470 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f  n is active)..*/
29480 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
29490 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20  rMovepage(Pager 
294a0 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20  *pPager, DbPage 
294b0 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pPg, Pgno pgno)
294c0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  {.  PgHdr *pPgOl
294d0 64 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  d;  /* The page 
294e0 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
294f0 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 0a 20  n. */.  int h;. 
29500 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67   Pgno needSyncPg
29510 6e 6f 20 3d 20 30 3b 0a 0a 20 20 70 61 67 65 72  no = 0;..  pager
29520 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
29530 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
29540 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52  ef>0 );..  PAGER
29550 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20  TRACE5("MOVE %d 
29560 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e  page %d (needSyn
29570 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25  c=%d) moves to %
29580 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47  d\n", .      PAG
29590 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
295a0 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
295b0 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20  edSync, pgno);. 
295c0 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20   IOTRACE(("MOVE 
295d0 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61  %p %d %d\n", pPa
295e0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
295f0 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f  pgno))..  pager_
29600 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
29610 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65  ;.  if( pPg->nee
29620 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65  dSync ){.    nee
29630 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d  dSyncPgno = pPg-
29640 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
29650 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
29660 6c 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70  l || (int)pgno>p
29670 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
29680 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
29690 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20   pPg->dirty );. 
296a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
296b0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
296c0 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
296d0 70 50 67 20 66 72 6f 6d 20 69 74 73 20 68 61 73  pPg from its has
296e0 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c  h-chain */.  unl
296f0 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
29700 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a  ger, pPg);..  /*
29710 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
29720 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
29730 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
29740 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
29750 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73   ** from its has
29760 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
29770 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
29780 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
29790 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
297a0 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
297b0 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
297c0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
297d0 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
297e0 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
297f0 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
29800 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
29810 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72    pPgOld = pager
29820 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
29830 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
29840 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Old ){.    asser
29850 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d  t( pPgOld->nRef=
29860 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b  =0 );.    unlink
29870 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
29880 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d  , pPgOld);.    m
29890 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29  akeClean(pPgOld)
298a0 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53  ;.    pPg->needS
298b0 79 6e 63 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65  ync = pPgOld->ne
298c0 65 64 53 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b  edSync;.  }else{
298d0 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
298e0 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  nc = 0;.  }.  pP
298f0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  g->inJournal = s
29900 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
29910 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
29920 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 2f  nal, pgno);..  /
29930 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
29940 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67  e number for pPg
29950 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
29960 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68  nto the new hash
29970 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73  -chain. */.  ass
29980 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
29990 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
299a0 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26  no;.  h = pgno &
299b0 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
299c0 31 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  1);.  if( pPager
299d0 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20  ->aHash[h] ){.  
299e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
299f0 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
29a00 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
29a10 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
29a20 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
29a30 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  g;.  }.  pPg->pN
29a40 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
29a50 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50  ->aHash[h];.  pP
29a60 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
29a70 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72   pPg;.  pPg->pPr
29a80 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d  evHash = 0;..  m
29a90 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
29aa0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
29ab0 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  che = 1;..  if( 
29ac0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
29ad0 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
29ae0 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
29af0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
29b00 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
29b10 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
29b20 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
29b30 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
29b40 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
29b50 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
29b60 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
29b70 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
29b80 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
29b90 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
29ba0 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61  d the .    ** Pa
29bb0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
29bc0 69 74 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  it has been set.
29bd0 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62   This needs to b
29be0 65 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f  e remedied by lo
29bf0 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ading.    ** the
29c00 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
29c10 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73  ager-cache and s
29c20 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72  etting the PgHdr
29c30 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a  .needSync flag..
29c40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
29c50 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
29c60 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e  load the page in
29c70 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  to the page-cach
29c80 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20  e fails, (due.  
29c90 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63    ** to a malloc
29ca0 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65  () or IO failure
29cb0 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74  ), clear the bit
29cc0 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e   in the pInJourn
29cd0 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61  al[].    ** arra
29ce0 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
29cf0 20 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61   the page is loa
29d00 64 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20  ded and written 
29d10 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20  again in.    ** 
29d20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
29d30 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74  , it may be writ
29d40 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
29d50 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  ase file before.
29d60 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e      ** it is syn
29d70 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ced into the jou
29d80 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
29d90 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20  way, it may end 
29da0 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  up in.    ** the
29db0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77   journal file tw
29dc0 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73  ice, but that is
29dd0 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a   not a problem..
29de0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
29df0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
29e00 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75  t() call may cau
29e10 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  se the journal t
29e20 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a  o sync. So make.
29e30 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20      ** sure the 
29e40 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
29e50 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a  lag is set too..
29e60 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72      */.    int r
29e70 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  c;.    PgHdr *pP
29e80 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74  gHdr;.    assert
29e90 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
29ea0 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nc );.    rc = s
29eb0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
29ec0 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50  Pager, needSyncP
29ed0 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  gno, &pPgHdr);. 
29ee0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29ef0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
29f00 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
29f10 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 6e 65 65  rnal && (int)nee
29f20 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65  dSyncPgno<=pPage
29f30 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
29f40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29f50 42 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67  BitvecClear(pPag
29f60 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
29f70 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20  needSyncPgno);. 
29f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
29f90 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
29fa0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
29fb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
29fc0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
29fd0 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65  ;.    pPgHdr->ne
29fe0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
29ff0 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61  pPgHdr->inJourna
2a000 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44  l = 1;.    makeD
2a010 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20  irty(pPgHdr);.  
2a020 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2a030 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
2a040 0a 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ..  pagerLeave(p
2a050 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
2a060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2a070 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
2a080 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2a090 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
2a0a0 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
2a0b0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
2a0c0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62  3PagerGetData(Db
2a0d0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
2a0e0 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41  turn PGHDR_TO_DA
2a0f0 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  TA(pPg);.}../*.*
2a100 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
2a110 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e  er to the Pager.
2a120 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
2a130 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a  "extra" space .*
2a140 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
2a150 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  g with the speci
2a160 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
2a170 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
2a180 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20  GetExtra(DbPage 
2a190 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
2a1a0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
2a1b0 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28  ager;.  return (
2a1c0 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f  pPager?PGHDR_TO_
2a1d0 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
2a1e0 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r):0);.}../*.** 
2a1f0 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
2a200 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
2a210 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
2a220 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
2a230 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
2a240 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
2a250 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
2a260 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
2a270 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
2a280 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
2a290 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
2a2a0 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
2a2b0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
2a2c0 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
2a2d0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
2a2e0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
2a2f0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
2a300 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
2a310 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2a320 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
2a330 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2a340 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
2a350 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
2a360 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
2a370 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
2a380 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2a390 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
2a3a0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
2a3b0 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
2a3c0 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
2a3d0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2a3e0 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
2a3f0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
2a400 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2a410 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  RMAL.           
2a420 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
2a430 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2a440 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
2a450 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
2a460 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  GMODE_QUERY<0 );
2a470 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2a480 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
2a490 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  MAL>=0 && PAGER_
2a4a0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2a4b0 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66  USIVE>=0 );.  if
2a4c0 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70  ( eMode>=0 && !p
2a4d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2a4e0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
2a4f0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65  xclusiveMode = e
2a500 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mode;.  }.  retu
2a510 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  rn (int)pPager->
2a520 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d  exclusiveMode;.}
2a530 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2a540 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  TEST./*.** Print
2a550 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c   a listing of al
2a560 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  l referenced pag
2a570 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66  es and their ref
2a580 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   count..*/.void 
2a590 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 64  sqlite3PagerRefd
2a5a0 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  ump(Pager *pPage
2a5b0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
2a5c0 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
2a5d0 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
2a5e0 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
2a5f0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
2a600 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e  nRef<=0 ) contin
2a610 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ue;.    sqlite3D
2a620 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45  ebugPrintf("PAGE
2a630 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65   %3d addr=%p nRe
2a640 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
2a650 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44   pPg->pgno, PGHD
2a660 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
2a670 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a  pPg->nRef);.  }.
2a680 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66  }.#endif..#endif
2a690 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2a6a0 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.