/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 547079d36fb3ca227e77e669268ea910c90774ef:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 34 34  : pager.c,v 1.44
0350: 32 20 32 30 30 38 2f 30 35 2f 30 37 20 31 32 3a  2 2008/05/07 12:
0360: 34 35 3a 34 31 20 64 72 68 20 45 78 70 20 24 0a  45:41 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  its argument. Th
0690: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
06a0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
06b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c  is returned. FIL
06c0: 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65  EHANDLEID() take
06d0: 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  s an sqlite3_fil
06e0: 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69  e.** struct as i
06f0: 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ts argument..*/.
0700: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0710: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0720: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0730: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0740: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0750: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0760: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0770: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0780: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0790: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
07a0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
07b0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07c0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07d0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
0800: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0810: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0840: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0850: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0860: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0870: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0880: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0890: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
08a0: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
08b0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08c0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08e0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08f0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
0900: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0920: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0930: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0940: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0970: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0980: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0990: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
09a0: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
09b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09c0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09f0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
0a00: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0a10: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a30: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a40: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a50: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a70: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a80: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a90: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0aa0: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ad0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ae0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b20: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b40: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b50: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b80: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b90: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0bc0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bd0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0be0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bf0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0c00: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0c10: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c20: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c30: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c40: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c50: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c80: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c90: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0ca0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0cc0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cd0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0ce0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0d10: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d20: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f  o is to remove o
0d30: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0d40: 20 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63             trunc
0d50: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
0d60: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61  file and the tra
0d70: 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  nsaction .**    
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69     will be commi
0da0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0db0: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0dc0: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0dd0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0de0: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0df0: 33 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75  3PagerGet() occu
0e00: 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  rs, the state tr
0e10: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e20: 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66  ER_SHARED..** Af
0e30: 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61  ter all pages ha
0e40: 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ve been released
0e50: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61   using sqlite_pa
0e60: 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74  ge_unref(),.** t
0e70: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0e80: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47  ions back to PAG
0e90: 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  ER_UNLOCK.  The 
0ea0: 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68  first time.** th
0eb0: 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  at sqlite3PagerW
0ec0: 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
0ed0: 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  , the state tran
0ee0: 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41  sitions to.** PA
0ef0: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28  GER_RESERVED.  (
0f00: 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65  Note that sqlite
0f10: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61  3PagerWrite() ca
0f20: 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c  n only be.** cal
0f30: 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61  led on an outsta
0f40: 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68  nding page which
0f50: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
0f60: 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65  pager must.** be
0f70: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
0f80: 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73   before it trans
0f90: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0fa0: 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41  RESERVED.).** PA
0fb0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61  GER_RESERVED mea
0fc0: 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
0fd0: 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63   an open rollbac
0fe0: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68  k journal..** Th
0ff0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  e transition to 
1000: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1010: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e  occurs before an
1020: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
1030: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1040: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75  abase file, thou
1050: 67 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  gh writes to the
1060: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1070: 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68  rnal occurs with
1080: 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45   just PAGER_RESE
1090: 52 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20  RVED.  After an 
10a0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
10b0: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
10c0: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
10d0: 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73  haseTwo(), the s
10e0: 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b  tate can go back
10f0: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1100: 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73  ,.** or it can s
1110: 74 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43  tay at PAGER_EXC
1120: 4c 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65  LUSIVE if we are
1130: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
1140: 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64  cess mode..*/.#d
1150: 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f  efine PAGER_UNLO
1160: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
1170: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20  e PAGER_SHARED  
1180: 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20      1   /* same 
1190: 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  as SHARED_LOCK *
11a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
11b0: 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20  RESERVED    2   
11c0: 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52  /* same as RESER
11d0: 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  VED_LOCK */.#def
11e0: 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ine PAGER_EXCLUS
11f0: 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d  IVE   4   /* sam
1200: 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e as EXCLUSIVE_L
1210: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1220: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
1230: 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65   5../*.** If the
1240: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1250: 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f  ERVED_LOCK macro
1260: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1270: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
1280: 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20  .** then failed 
1290: 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20  attempts to get 
12a0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
12b0: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
12c0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  busy callback..*
12d0: 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79  * This is off by
12e0: 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65   default.  To se
12f0: 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20  e why, consider 
1300: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
1310: 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53  enario:.** .** S
1320: 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20  uppose thread A 
1330: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68  already has a sh
1340: 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  ared lock and wa
1350: 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  nts a reserved l
1360: 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42  ock..** Thread B
1370: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1380: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64  eserved lock and
1390: 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73   wants an exclus
13a0: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a  ive lock.  If.**
13b0: 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72   both threads ar
13c0: 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75  e using their bu
13d0: 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74  sy callbacks, it
13e0: 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67   might be a long
13f0: 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20   time.** be for 
1400: 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  one of the threa
1410: 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61  ds give up and a
1420: 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20  llows the other 
1430: 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42  to proceed..** B
1440: 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ut if the thread
1450: 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74   trying to get t
1460: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
1470: 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c   gives up quickl
1480: 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65  y.** (if it neve
1490: 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75  r invokes its bu
14a0: 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65  sy callback) the
14b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e  n the contention
14c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f   will be.** reso
14d0: 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f  lved quickly..*/
14e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14f0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1500: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
1510: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1520: 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a  _LOCK 0.#endif..
1530: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
1540: 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75   rounds values u
1550: 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  p so that if the
1560: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64   value is an add
1570: 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75  ress it.** is gu
1580: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1590: 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69  n address that i
15a0: 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20  s aligned to an 
15b0: 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  8-byte boundary.
15c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43  .*/.#define FORC
15d0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20  E_ALIGNMENT(X)  
15e0: 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 74   (((X)+7)&~7)..t
15f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
1600: 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a 0a 2a  Hdr PgHdr;../*.*
1610: 2a 20 45 61 63 68 20 70 61 67 65 72 20 73 74 6f  * Each pager sto
1620: 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c  res all currentl
1630: 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  y unreferenced p
1640: 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74 20 73  ages in a list s
1650: 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65 61 73  orted.** in leas
1660: 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65 64 20  t-recently-used 
1670: 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69 2e 65  (LRU) order (i.e
1680: 2e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 6d  . the first item
1690: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68 61 73   on the list has
16a0: 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 72 65   .** not been re
16b0: 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20 6c 6f  ferenced in a lo
16c0: 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c 61 73  ng time, the las
16d0: 74 20 69 74 65 6d 20 68 61 73 20 62 65 65 6e 20  t item has been 
16e0: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  recently.** used
16f0: 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ). An instance o
1700: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1710: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61 73 20   is included as 
1720: 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  part of each.** 
1730: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
1740: 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f 73 65  for this purpose
1750: 20 28 76 61 72 69 61 62 6c 65 20 50 61 67 65 72   (variable Pager
1760: 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41 64 64  .lru)..**.** Add
1770: 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 6d 65  itionally, if me
1780: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
1790: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 6c 20  is enabled, all 
17a0: 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  unreferenced pag
17b0: 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  es .** are store
17c0: 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20 4c 52  d in a global LR
17d0: 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c 20 76  U list (global v
17e0: 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65 33 4c  ariable sqlite3L
17f0: 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a 2a 0a  ruPageList)..**.
1800: 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  ** In both cases
1810: 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75 4c 69  , the PagerLruLi
1820: 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  st.pFirstSynced 
1830: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
1840: 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  to.** the first 
1850: 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f 72 72  page in the corr
1860: 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74 20 74  esponding list t
1870: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
1880: 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79 6e 63  uire an.** fsync
1890: 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 66  () operation bef
18a0: 6f 72 65 20 69 74 73 20 6d 65 6d 6f 72 79 20 63  ore its memory c
18b0: 61 6e 20 62 65 20 72 65 63 6c 61 69 6d 65 64 2e  an be reclaimed.
18c0: 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 70   If no such.** p
18d0: 61 67 65 20 65 78 69 73 74 73 2c 20 50 61 67 65  age exists, Page
18e0: 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73 74 53  rLruList.pFirstS
18f0: 79 6e 63 65 64 20 69 73 20 73 65 74 20 74 6f 20  ynced is set to 
1900: 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  NULL..*/.typedef
1910: 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75   struct PagerLru
1920: 4c 69 73 74 20 50 61 67 65 72 4c 72 75 4c 69 73  List PagerLruLis
1930: 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c  t;.struct PagerL
1940: 72 75 4c 69 73 74 20 7b 0a 20 20 50 67 48 64 72  ruList {.  PgHdr
1950: 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1960: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1970: 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a 2f 0a 20  in LRU list */. 
1980: 20 50 67 48 64 72 20 2a 70 4c 61 73 74 3b 20 20   PgHdr *pLast;  
1990: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
19a0: 70 61 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74  page in LRU list
19b0: 20 28 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e   (the most recen
19c0: 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a 20 20 50  tly used) */.  P
19d0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
19e0: 65 64 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ed;   /* First p
19f0: 61 67 65 20 69 6e 20 6c 69 73 74 20 77 69 74 68  age in list with
1a00: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
1a10: 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  =0 */.};../*.** 
1a20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
1a30: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
1a40: 20 74 68 65 20 6e 65 78 74 20 61 6e 64 20 70 72   the next and pr
1a50: 65 76 69 6f 75 73 20 70 6f 69 6e 74 65 72 73 20  evious pointers 
1a60: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69 6e 6b 20  used.** to link 
1a70: 61 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  a PgHdr structur
1a80: 65 20 69 6e 74 6f 20 61 20 50 61 67 65 72 4c 72  e into a PagerLr
1a90: 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20 6c 69 73  uList linked lis
1aa0: 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  t. .*/.typedef s
1ab0: 74 72 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69  truct PagerLruLi
1ac0: 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 3b  nk PagerLruLink;
1ad0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75  .struct PagerLru
1ae0: 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64 72 20 2a  Link {.  PgHdr *
1af0: 70 4e 65 78 74 3b 0a 20 20 50 67 48 64 72 20 2a  pNext;.  PgHdr *
1b00: 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  pPrev;.};../*.**
1b10: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
1b20: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
1b30: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
1b40: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
1b50: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1b60: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1b70: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1b80: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1b90: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1ba0: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
1bb0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
1bc0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
1bd0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1be0: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1bf0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
1c00: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70  erWrite() on a p
1c10: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
1c20: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1c30: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1c40: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1c50: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61  t time sqlite3Pa
1c60: 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73  gerWrite().** is
1c70: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69   called, the ori
1c80: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
1c90: 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  nts are written 
1ca0: 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
1cb0: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  k.** journal and
1cc0: 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c   PgHdr.inJournal
1cd0: 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53   and PgHdr.needS
1ce0: 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61  ync are set.  La
1cf0: 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ter, once.** the
1d00: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61   journal page ha
1d10: 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74  s made it onto t
1d20: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c  he disk surface,
1d30: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
1d40: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20  ** is cleared.  
1d50: 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67  The modified pag
1d60: 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74  e cannot be writ
1d70: 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
1d80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1d90: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
1da0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  l the journal pa
1db0: 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ges has been syn
1dc0: 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  ced to disk and 
1dd0: 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65  the.** PgHdr.nee
1de0: 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63  dSync has been c
1df0: 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leared..**.** Th
1e00: 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c  e PgHdr.dirty fl
1e10: 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73  ag is set when s
1e20: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e30: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
1e40: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
1e50: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
1e60: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
1e70: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1e80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1e90: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1ea0: 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66 20 69 6d  ** Details of im
1eb0: 70 6f 72 74 61 6e 74 20 73 74 72 75 63 74 75 72  portant structur
1ec0: 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  e elements:.**.*
1ed0: 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a  * needSync.**.**
1ee0: 20 20 20 20 20 49 66 20 74 68 69 73 20 69 73 20       If this is 
1ef0: 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  true, this means
1f00: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1f10: 73 61 66 65 20 74 6f 20 77 72 69 74 65 20 74 68  safe to write th
1f20: 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 6f  e page.**     co
1f30: 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74  ntent to the dat
1f40: 61 62 61 73 65 20 62 65 63 61 75 73 65 20 74 68  abase because th
1f50: 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  e original conte
1f60: 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20 20  nt needed.**    
1f70: 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68 61   for rollback ha
1f80: 73 20 6e 6f 74 20 62 79 20 73 79 6e 63 65 64 20  s not by synced 
1f90: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
1fa0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1fb0: 20 20 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61       The origina
1fc0: 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68 61  l content may ha
1fd0: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1fe0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  to the rollback 
1ff0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 62  journal.**     b
2000: 75 74 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65  ut it has not ye
2010: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  t been synced.  
2020: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 77 72 69  So we cannot wri
2030: 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
2040: 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 62  se.**     file b
2050: 65 63 61 75 73 65 20 70 6f 77 65 72 20 66 61 69  ecause power fai
2060: 6c 75 72 65 20 6d 69 67 68 74 20 63 61 75 73 65  lure might cause
2070: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 65   the page in the
2080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2090: 20 20 20 20 20 74 6f 20 6e 65 76 65 72 20 72 65       to never re
20a0: 61 63 68 20 74 68 65 20 64 69 73 6b 2e 20 20 49  ach the disk.  I
20b0: 74 20 69 73 20 61 73 20 69 66 20 74 68 65 20 77  t is as if the w
20c0: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
20d0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
20e0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
20f0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
2100: 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
2110: 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20  .**     .**     
2120: 54 68 69 73 20 66 6c 61 67 20 69 73 20 66 61 6c  This flag is fal
2130: 73 65 20 69 66 20 74 68 65 20 70 61 67 65 20 63  se if the page c
2140: 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c 79 20 6d  ontent exactly m
2150: 61 74 63 68 65 73 20 77 68 61 74 0a 2a 2a 20 20  atches what.**  
2160: 20 20 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69     currently exi
2170: 73 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  sts in the datab
2180: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 6e  ase file.  The n
2190: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
21a0: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c 73  also.**     fals
21b0: 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e if the origina
21c0: 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
21d0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
21e0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
21f0: 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 61  **     journal a
2200: 6e 64 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  nd synced.  If t
2210: 68 65 20 70 61 67 65 20 72 65 70 72 65 73 65 6e  he page represen
2220: 74 73 20 61 20 6e 65 77 20 70 61 67 65 20 74 68  ts a new page th
2230: 61 74 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65  at has.**     be
2240: 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  en added onto th
2250: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2260: 61 62 61 73 65 20 64 75 72 69 6e 67 20 74 68 65  abase during the
2270: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20   current.**     
2280: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2290: 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69   needSync flag i
22a0: 73 20 74 72 75 65 20 75 6e 74 69 6c 20 74 68 65  s true until the
22b0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22c0: 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20 69  se.**     size i
22d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
22e0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 73 79  ader has been sy
22f0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
2300: 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a  .** inJournal.**
2310: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 69 73 20  .**     This is 
2320: 74 72 75 65 20 69 66 20 74 68 65 20 6f 72 69 67  true if the orig
2330: 69 6e 61 6c 20 70 61 67 65 20 68 61 73 20 62 65  inal page has be
2340: 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  en written into 
2350: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20 20  the main.**     
2360: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2370: 2e 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  .  This is alway
2380: 73 20 66 61 6c 73 65 20 66 6f 72 20 6e 65 77 20  s false for new 
2390: 70 61 67 65 73 20 61 64 64 65 64 20 74 6f 0a 2a  pages added to.*
23a0: 2a 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66  *     the end of
23b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23c0: 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  le during the cu
23d0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23e0: 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74 68  n..**     And th
23f0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 6e 6f 74  is flag says not
2400: 68 69 6e 67 20 61 62 6f 75 74 20 77 68 65 74 68  hing about wheth
2410: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
2420: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61 73  urnal.**     has
2430: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2440: 64 69 73 6b 2e 20 20 46 6f 72 20 70 61 67 65 73  disk.  For pages
2450: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2460: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2470: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2480: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
2490: 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20  pression should 
24a0: 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 3a 0a  always be true:.
24b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a 6f  **.**       inJo
24c0: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
24d0: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
24e0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
24f0: 6e 6f 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  no).**.**     Th
2500: 65 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  e pPager->pInJou
2510: 72 6e 61 6c 20 6f 62 6a 65 63 74 20 69 73 20 6f  rnal object is o
2520: 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68  nly valid for th
2530: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
2540: 20 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64    pages of the d
2550: 61 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77  atabase, not new
2560: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
2570: 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64  added to the end
2580: 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64  .**     of the d
2590: 61 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69  atabase, so obvi
25a0: 6f 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20  ously the above 
25b0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f  expression canno
25c0: 74 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69  t be.**     vali
25d0: 64 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e  d for new pages.
25e0: 20 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20    For new pages 
25f0: 69 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  inJournal is alw
2600: 61 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72  ays 0..**.** dir
2610: 74 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  ty.**.**     Whe
2620: 6e 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61  n true, this mea
2630: 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  ns that the cont
2640: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2650: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20  has been.**     
2660: 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65  modified and nee
2670: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
2680: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
2690: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
26a0: 20 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20     If false, it 
26b0: 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
26c0: 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  r the content of
26d0: 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20   the page is.** 
26e0: 20 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72      unchanged or
26f0: 20 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e   else the conten
2700: 74 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74  t is unimportant
2710: 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a   and we do not.*
2720: 2a 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68  *     care wheth
2730: 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20  er or not it is 
2740: 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
2750: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
2760: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d  **.**     This m
2770: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71  eans that the sq
2780: 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
2790: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f  llback() API sho
27a0: 75 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67  uld be.**     ig
27b0: 6e 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70  nored for this p
27c0: 61 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f  age.  The DontRo
27d0: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74  llback() API att
27e0: 65 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20  empts to say.** 
27f0: 20 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e      that the con
2800: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
2810: 20 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d   on disk is unim
2820: 70 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61  portant (it is a
2830: 6e 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20  n.**     unused 
2840: 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
2850: 6c 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74  list) so that it
2860: 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20   is unnecessary 
2870: 74 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62  to .**     rollb
2880: 61 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ack changes to t
2890: 68 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65  his page because
28a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
28b0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  the page.**     
28c0: 63 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f  can change witho
28d0: 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
28e0: 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  meaning of the d
28f0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a  atabase.  This.*
2900: 2a 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72  *     flag overr
2910: 69 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c  ides any DontRol
2920: 6c 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e  lback() attempt.
2930: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
2940: 65 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61  et.**     when a
2950: 20 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69   page that origi
2960: 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  nally contained 
2970: 76 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64  valid data is ad
2980: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
2990: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74  e freelist.  Lat
29a0: 65 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74  er in the same t
29b0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73  ransaction, this
29c0: 20 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20   page might.**  
29d0: 20 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f     be pulled fro
29e0: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  m the freelist a
29f0: 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
2a00: 6d 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  mething differen
2a10: 74 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20  t.**     and at 
2a20: 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44  that point the D
2a30: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50  ontRollback() AP
2a40: 49 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  I will be called
2a50: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20   because.**     
2a60: 70 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d  pages taken from
2a70: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f   the freelist do
2a80: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a90: 70 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20  protected by.** 
2aa0: 20 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b      the rollback
2ab0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74   journal.  But t
2ac0: 68 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68  his flag says th
2ad0: 61 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  at the page was.
2ae0: 2a 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69  **     not origi
2af0: 6e 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68  nally part of th
2b00: 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68  e freelist so th
2b10: 61 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64  at it still need
2b20: 73 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72  s to.**     be r
2b30: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
2b40: 69 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65  ite of any subse
2b50: 71 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61  quent DontRollba
2b60: 63 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  ck() calls..**.*
2b70: 2a 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a  * needRead .**.*
2b80: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
2b90: 6d 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65  means (when true
2ba0: 29 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  ) that the conte
2bb0: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2bc0: 61 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65  as.**     not ye
2bd0: 74 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72  t been loaded fr
2be0: 6f 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e  om disk.  The in
2bf0: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20  -memory content 
2c00: 69 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67  is just.**     g
2c10: 61 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c  arbage.  (Actual
2c20: 6c 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20  ly, we zero the 
2c30: 63 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75  content, but you
2c40: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20   should not.**  
2c50: 20 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75     make any assu
2c60: 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68  mptions about th
2c70: 65 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74  e content nevert
2c80: 68 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65  heless.)  If the
2c90: 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  .**     content 
2ca0: 69 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65  is needed in the
2cb0: 20 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75   future, it shou
2cc0: 6c 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ld be read from 
2cd0: 74 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69  the.**     origi
2ce0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
2cf0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48  e..*/.struct PgH
2d00: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
2d10: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
2d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2d30: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
2d40: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
2d50: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
2d80: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
2d90: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
2da0: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
2db0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
2dc0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
2dd0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
2de0: 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  .  PagerLruLink 
2df0: 66 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  free;           
2e00: 20 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72    /* Next and pr
2e10: 65 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65  evious free page
2e20: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
2e30: 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  extAll;         
2e40: 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20        /* A list 
2e50: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
2e60: 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20    u8 inJournal; 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20   /* TRUE if has 
2e90: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2ea0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2eb0: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ed0: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
2ee0: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
2ef0: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65  nges */.  u8 nee
2f00: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
2f20: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
2f30: 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67  writing this pag
2f40: 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  e */.  u8 always
2f50: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
2f60: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
2f70: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2f80: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
2f90: 0a 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20  .  u8 needRead; 
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e    /* Read conten
2fc0: 74 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28  t if PagerWrite(
2fd0: 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  ) is called */. 
2fe0: 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b   short int nRef;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65  /* Number of use
3010: 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  rs of this page 
3020: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
3030: 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b  ty, *pPrevDirty;
3040: 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67      /* Dirty pag
3050: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
3060: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3070: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
3080: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65  agerLruLink gfre
3090: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
30a0: 20 47 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20   Global list of 
30b0: 6e 52 65 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f  nRef==0 pages */
30c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
30d0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
30e0: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
30f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  ;.#endif.  void 
3100: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3120: 65 20 64 61 74 61 20 2a 2f 0a 20 20 2f 2a 20 50  e data */.  /* P
3130: 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
3140: 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20  s of local data 
3150: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 69 73  appended to this
3160: 20 68 65 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f   header */.};../
3170: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
3180: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
3190: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
31a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
31b0: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
31c0: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
31d0: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
31e0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
31f0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
3200: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
3210: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
3220: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
3230: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
3240: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
3250: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
3260: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
3270: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
3280: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
3290: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
32a0: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
32b0: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
32c0: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
32d0: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
32e0: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
32f0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
3300: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
3310: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
3320: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
3330: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
3340: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
3350: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
3360: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
3370: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
3380: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
3390: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
33a0: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
33b0: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
33c0: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
33d0: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
33e0: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
33f0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
3400: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
3410: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
3420: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
3430: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
3440: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
3450: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
3460: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
3470: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67  tatement */.  Pg
3480: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
3490: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
34a0: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
34b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
34c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
34d0: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
34f0: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
3500: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3510: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  l */.};../*.** A
3520: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
3530: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
3540: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
3550: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
3560: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
3570: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3580: 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43  D,N,X) if( P->xC
3590: 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43  odec!=0 ){ P->xC
35a0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
35b0: 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65  g,D,N,X); }.# de
35c0: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
35d0: 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d  N,X) ((char*)(P-
35e0: 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43  >xCodec!=0?P->xC
35f0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
3600: 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c  g,D,N,X):D)).#el
3610: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
3620: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e  C1(P,D,N,X) /* N
3630: 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65  O-OP */.# define
3640: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
3650: 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64   ((char*)D).#end
3660: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
3670: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  t a pointer to a
3680: 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f   PgHdr into a po
3690: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74  inter to its dat
36a0: 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67  a.** and back ag
36b0: 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ain..*/.#define 
36c0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29  PGHDR_TO_DATA(P)
36d0: 20 20 20 20 28 28 50 29 2d 3e 70 44 61 74 61 29      ((P)->pData)
36e0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
36f0: 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76  O_EXTRA(G,P) ((v
3700: 6f 69 64 2a 29 26 28 28 47 29 5b 31 5d 29 29 0a  oid*)&((G)[1])).
3710: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
3720: 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a  _HIST(P,PGR)  \.
3730: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67              ((Pg
3740: 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72  History*)&((char
3750: 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47  *)(&(P)[1]))[(PG
3760: 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a  R)->nExtra])../*
3770: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
3780: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
3790: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
37a0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
37b0: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72  .**.** Pager.err
37c0: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
37d0: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
37e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
37f0: 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45   or.** or SQLITE
3800: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
3810: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
3820: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
3830: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
3840: 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64   and is returned
3850: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   as the result o
3860: 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61  f every major pa
3870: 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54  ger API call.  T
3880: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  he.** SQLITE_FUL
3890: 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  L return code is
38a0: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
38b0: 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73  ent. It persists
38c0: 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a   only until the.
38d0: 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66  ** next successf
38e0: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
38f0: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
3900: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
3910: 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  o,.** SQLITE_FUL
3920: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
3930: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
3940: 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  erGet() and sqli
3950: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
3960: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
3970: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
3980: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
3990: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
39a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
39b0: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
39c0: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
39d0: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
39e0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e    u8 journalOpen
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3a00: 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
3a10: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3a20: 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  s is valid */.  
3a30: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
3a40: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
3a50: 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66  rue if header of
3a60: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
3a70: 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  ed */.  u8 useJo
3a80: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
3a90: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
3aa0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
3ab0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
3ac0: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3ae0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
3af0: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
3b00: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
3b10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3b20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
3b30: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3b40: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
3b50: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
3b80: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
3b90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
3ba0: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
3bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3bc0: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
3bd0: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
3be0: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
3bf0: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c10: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
3c20: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
3c30: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
3c40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3c50: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
3c60: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
3c70: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
3c80: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
3c90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
3ca0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
3cb0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
3cc0: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74  _FULL */.  u8 st
3cd0: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
3ce0: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
3cf0: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
3d00: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
3d10: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
3d20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3d30: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
3d40: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
3d50: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
3d60: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
3d70: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
3d80: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
3d90: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
3da0: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
3db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3dc0: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
3dd0: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
3de0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
3df0: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
3e00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3e10: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
3e20: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
3e30: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
3e40: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
3e50: 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62  isable DontRollb
3e60: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
3e70: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
3e80: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3e90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
3ea0: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
3eb0: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74   I/O */.  u8 set
3ec0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
3ed0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ee0: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
3ef0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
3f00: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
3f10: 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  otSync;         
3f20: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f30: 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f  . While true, do
3f40: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
3f50: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63  ache */.  u8 exc
3f60: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
3f70: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f80: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
3f90: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
3fa0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
3fb0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
3fc0: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
3fd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
3fe0: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
3ff0: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
4000: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
4010: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
4020: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
4030: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33  -counter */.  u3
4040: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
4050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
4060: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
4070: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
4080: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
4090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
40a0: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
40b0: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
40c0: 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20  .  int dbSize;  
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
40e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
40f0: 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  s in the file */
4100: 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a  .  int origDbSiz
4110: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
4120: 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20  * dbSize before 
4130: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e  the current chan
4140: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  ge */.  int stmt
4150: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4160: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
4170: 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65  atabase (in page
4180: 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  s) at stmt_begin
4190: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  () */.  int nRec
41a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
41b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
41c0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
41d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  o the journal */
41e0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74  .  u32 cksumInit
41f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4200: 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76  * Quasi-random v
4210: 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76  alue added to ev
4220: 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  ery checksum */.
4230: 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20    int stmtNRec; 
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4250: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
4260: 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f  ds in stmt subjo
4270: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
4280: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
4290: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
42a0: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
42b0: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
42c0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61  page */.  int pa
42d0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
42e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
42f0: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
4300: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  ge */.  int nPag
4310: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
4320: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
4330: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
4340: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
4350: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
4360: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4370: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
4380: 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e  ages with PgHdr.
4390: 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20  nRef>0 */.  int 
43a0: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
43b0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
43c0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
43d0: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
43e0: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  che */.  Pgno mx
43f0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
4400: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
4410: 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20  allowed size of 
4420: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
4430: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
4440: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
4450: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
4460: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4480: 20 42 69 74 76 65 63 20 2a 70 49 6e 53 74 6d 74   Bitvec *pInStmt
4490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
44a0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
44b0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
44c0: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
44d0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
44e0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
44f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
4500: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
4510: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
4520: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
4530: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4540: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72   */.  char *zDir
4550: 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20  ectory;         
4560: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68    /* Directory h
4570: 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  old database and
4580: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
4590: 2f 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 4a  /.  char *zStmtJ
45a0: 72 6e 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  rnl;            
45b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
45c0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
45d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74   file */.  sqlit
45e0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66  e3_file *fd, *jf
45f0: 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64  d;     /* File d
4600: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
4610: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
4620: 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nal */.  sqlite3
4630: 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20  _file *stfd;    
4640: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
4650: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
4660: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
4670: 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e  rnal*/.  BusyHan
4680: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
4690: 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  er;  /* Pointer 
46a0: 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61  to sqlite.busyHa
46b0: 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 61 67 65 72  ndler */.  Pager
46c0: 4c 72 75 4c 69 73 74 20 6c 72 75 3b 20 20 20 20  LruList lru;    
46d0: 20 20 20 20 20 20 20 2f 2a 20 4c 52 55 20 6c 69         /* LRU li
46e0: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
46f0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c   */.  PgHdr *pAl
4700: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
4710: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
4720: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
4730: 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  r *pStmt;       
4740: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
4750: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4760: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
4770: 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20  rnal */.  PgHdr 
4780: 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20  *pDirty;        
4790: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
47a0: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
47b0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
47c0: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
47d0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
47e0: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
47f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4800: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
4810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4820: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
4830: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
4840: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
4850: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
4860: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4870: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
4880: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
4890: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
48a0: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
48b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
48c0: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
48d0: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
48e0: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
48f0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
4900: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
4910: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
4920: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
4930: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
4940: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
4950: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
4960: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
4970: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
4980: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
4990: 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  Miss;           
49a0: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61   /* Cache hits a
49b0: 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20  nd missing */.  
49c0: 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74  int nRead, nWrit
49d0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  e;          /* D
49e0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
49f0: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
4a00: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
4a10: 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67  estructor)(DbPag
4a20: 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c  e*,int); /* Call
4a30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
4a40: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
4a50: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
4a60: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c  initer)(DbPage*,
4a70: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
4a80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
4a90: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
4aa0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
4ab0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
4ac0: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
4ad0: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
4ae0: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
4af0: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
4b00: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
4b10: 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20  *pCodecArg;     
4b20: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
4b30: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
4b40: 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ec() */.#endif. 
4b50: 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20   int nHash;     
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b70: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  Size of the page
4b80: 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  r hash table */.
4b90: 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b    PgHdr **aHash;
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4bb0: 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d   Hash table to m
4bc0: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ap page number t
4bd0: 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65  o PgHdr */.#ifde
4be0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4bf0: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
4c00: 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74  T.  Pager *pNext
4c10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c20: 2f 2a 20 44 6f 75 62 6c 79 20 6c 69 6e 6b 65 64  /* Doubly linked
4c30: 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20   list of pagers 
4c40: 6f 6e 20 77 68 69 63 68 20 2a 2f 0a 20 20 50 61  on which */.  Pa
4c50: 67 65 72 20 2a 70 50 72 65 76 3b 20 20 20 20 20  ger *pPrev;     
4c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
4c70: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
4c80: 6f 72 79 28 29 20 77 69 6c 6c 20 77 6f 72 6b 20  ory() will work 
4c90: 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73 65 4d  */.  int iInUseM
4ca0: 4d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M;              
4cb0: 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20   /* Non-zero if 
4cc0: 75 6e 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 4d  unavailable to M
4cd0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73  M */.  int iInUs
4ce0: 65 44 42 3b 20 20 20 20 20 20 20 20 20 20 20 20  eDB;            
4cf0: 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69     /* Non-zero i
4d00: 66 20 69 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c  f in sqlite3_rel
4d10: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f  ease_memory() */
4d20: 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a  .#endif.  char *
4d30: 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20  pTmpSpace;      
4d40: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70        /* Pager.p
4d50: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
4d60: 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75   space for tmp u
4d70: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  se */.  char dbF
4d80: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
4d90: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
4da0: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
4db0: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
4dc0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
4dd0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
4de0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
4df0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
4e00: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
4e10: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
4e20: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
4e30: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
4e40: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
4e50: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
4e60: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
4e70: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
4e80: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
4e90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4ea0: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
4eb0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4ec0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
4ed0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
4ee0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4ef0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
4f00: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
4f10: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
4f20: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
4f30: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4f40: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
4f50: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4f60: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
4f70: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69   to journal */.i
4f80: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4f90: 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 20 3d 20  _pgfree_count = 
4fa0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4fb0: 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20 66  of cache pages f
4fc0: 72 65 65 64 20 2a 2f 0a 23 20 64 65 66 69 6e 65  reed */.# define
4fd0: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20   PAGER_INCR(v)  
4fe0: 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  v++.#else.# defi
4ff0: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
5000: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
5010: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
5020: 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  iable points to 
5030: 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 64 6f  the head of a do
5040: 75 62 6c 65 2d 6c 69 6e 6b 65 64 20 6c 69 73 74  uble-linked list
5050: 0a 2a 2a 20 6f 66 20 61 6c 6c 20 70 61 67 65 72  .** of all pager
5060: 73 20 74 68 61 74 20 61 72 65 20 65 6c 69 67 69  s that are eligi
5070: 62 6c 65 20 66 6f 72 20 70 61 67 65 20 73 74 65  ble for page ste
5080: 61 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20  aling by the.** 
5090: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
50a0: 6d 65 6d 6f 72 79 28 29 20 69 6e 74 65 72 66 61  memory() interfa
50b0: 63 65 2e 20 20 41 63 63 65 73 73 20 74 6f 20 74  ce.  Access to t
50c0: 68 69 73 20 6c 69 73 74 20 69 73 0a 2a 2a 20 70  his list is.** p
50d0: 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65 20  rotected by the 
50e0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
50f0: 54 49 43 5f 4d 45 4d 32 20 6d 75 74 65 78 2e 0a  TIC_MEM2 mutex..
5100: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
5110: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
5120: 41 4e 41 47 45 4d 45 4e 54 0a 73 74 61 74 69 63  ANAGEMENT.static
5130: 20 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 50   Pager *sqlite3P
5140: 61 67 65 72 4c 69 73 74 20 3d 20 30 3b 0a 73 74  agerList = 0;.st
5150: 61 74 69 63 20 50 61 67 65 72 4c 72 75 4c 69 73  atic PagerLruLis
5160: 74 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  t sqlite3LruPage
5170: 4c 69 73 74 20 3d 20 7b 30 2c 20 30 2c 20 30 7d  List = {0, 0, 0}
5180: 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ;.#endif.../*.**
5190: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
51a0: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
51b0: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
51c0: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
51d0: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
51e0: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
51f0: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
5200: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
5210: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
5220: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
5230: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
5240: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
5250: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
5260: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
5270: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
5280: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
5290: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
52a0: 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65   begin.** writte
52b0: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
52c0: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
52d0: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
52e0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
52f0: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
5300: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
5310: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
5320: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
5330: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
5340: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
5350: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
5360: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
5370: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
5380: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
5390: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
53a0: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
53b0: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
53c0: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
53d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
53e0: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
53f0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
5400: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
5410: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
5420: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
5430: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
5440: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
5450: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
5460: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
5470: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
5480: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
5490: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
54a0: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
54b0: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
54c0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
54d0: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
54e0: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
54f0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
5500: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
5510: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
5520: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
5530: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
5540: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
5550: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
5560: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
5570: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
5580: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
5590: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
55a0: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
55b0: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
55c0: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
55d0: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
55e0: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
55f0: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
5600: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
5610: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
5620: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
5630: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
5640: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
5650: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
5660: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
5670: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
5680: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
5690: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
56a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
56b0: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
56c0: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
56d0: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
56e0: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
56f0: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
5700: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
5710: 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
5720: 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61  r and of each pa
5730: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
5740: 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a  l is determined.
5750: 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77  ** by the follow
5760: 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23  ing macros..*/.#
5770: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
5780: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
5790: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
57a0: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
57b0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
57c0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
57d0: 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74  ager. In the fut
57e0: 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20  ure, this could 
57f0: 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d  be.** set to som
5800: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
5810: 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72  m the disk contr
5820: 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72  oller. The impor
5830: 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65  tant.** characte
5840: 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69  ristic is that i
5850: 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69  t is the same si
5860: 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63  ze as a disk sec
5870: 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  tor..*/.#define 
5880: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5890: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
58a0: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
58b0: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
58c0: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
58d0: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
58e0: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
58f0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
5900: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
5910: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
5920: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
5930: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
5940: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
5950: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
5960: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
5970: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
5980: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
5990: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
59a0: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
59b0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
59c0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
59d0: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
59e0: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
59f0: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
5a00: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
5a10: 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50  ** Page number P
5a20: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20  AGER_MJ_PGNO is 
5a30: 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e  never used in an
5a40: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
5a50: 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72   (it is.** reser
5a60: 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20  ved for working 
5a70: 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73  around a windows
5a80: 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69  /posix incompati
5a90: 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a  bility). It is.*
5aa0: 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f  * used in the jo
5ab0: 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79  urnal to signify
5ac0: 20 74 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e   that the remain
5ad0: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
5ae0: 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64  al file .** is d
5af0: 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e  evoted to storin
5b00: 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  g a master journ
5b10: 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20  al name - there 
5b20: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65  are no more page
5b30: 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63  s to.** roll bac
5b40: 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  k. See comments 
5b50: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  for function wri
5b60: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
5b70: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
5b80: 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47  /./* #define PAG
5b90: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50  ER_MJ_PGNO(x) (P
5ba0: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
5bb0: 2d 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a  ->pageSize)) */.
5bc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a  #define PAGER_MJ
5bd0: 5f 50 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49  _PGNO(x) ((PENDI
5be0: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
5bf0: 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a  geSize))+1)../*.
5c00: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
5c10: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
5c20: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
5c30: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
5c40: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
5c50: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  3647../*.** The 
5c60: 70 61 67 65 72 45 6e 74 65 72 28 29 20 61 6e 64  pagerEnter() and
5c70: 20 70 61 67 65 72 4c 65 61 76 65 28 29 20 72 6f   pagerLeave() ro
5c80: 75 74 69 6e 65 73 20 61 63 71 75 69 72 65 20 61  utines acquire a
5c90: 6e 64 20 72 65 6c 65 61 73 65 0a 2a 2a 20 61 20  nd release.** a 
5ca0: 6d 75 74 65 78 20 6f 6e 20 65 61 63 68 20 70 61  mutex on each pa
5cb0: 67 65 72 2e 20 20 54 68 65 20 6d 75 74 65 78 20  ger.  The mutex 
5cc0: 69 73 20 72 65 63 75 72 73 69 76 65 2e 0a 2a 2a  is recursive..**
5cd0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73 70  .** This is a sp
5ce0: 65 63 69 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75  ecial-purpose mu
5cf0: 74 65 78 2e 20 20 49 74 20 6f 6e 6c 79 20 70 72  tex.  It only pr
5d00: 6f 76 69 64 65 73 20 6d 75 74 75 61 6c 20 65 78  ovides mutual ex
5d10: 63 6c 75 73 69 6f 6e 0a 2a 2a 20 62 65 74 77 65  clusion.** betwe
5d20: 65 6e 20 74 68 65 20 42 74 72 65 65 20 61 6e 64  en the Btree and
5d30: 20 74 68 65 20 4d 65 6d 6f 72 79 20 4d 61 6e 61   the Memory Mana
5d40: 67 65 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 72  gement sqlite3_r
5d50: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 0a  elease_memory().
5d60: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74  ** function.  It
5d70: 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 65 6e   does not preven
5d80: 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  t, for example, 
5d90: 74 77 6f 20 42 74 72 65 65 73 20 66 72 6f 6d 20  two Btrees from 
5da0: 61 63 63 65 73 73 69 6e 67 0a 2a 2a 20 74 68 65  accessing.** the
5db0: 20 73 61 6d 65 20 70 61 67 65 72 20 61 74 20 74   same pager at t
5dc0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 4f  he same time.  O
5dd0: 74 68 65 72 20 67 65 6e 65 72 61 6c 2d 70 75 72  ther general-pur
5de0: 70 6f 73 65 20 6d 75 74 65 78 65 73 20 69 6e 0a  pose mutexes in.
5df0: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
5e00: 65 72 20 68 61 6e 64 6c 65 20 74 68 61 74 20 63  er handle that c
5e10: 68 6f 72 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  hore..*/.#ifdef 
5e20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
5e30: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
5e40: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
5e50: 67 65 72 45 6e 74 65 72 28 50 61 67 65 72 20 2a  gerEnter(Pager *
5e60: 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73  p){.    p->iInUs
5e70: 65 44 42 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  eDB++;.    if( p
5e80: 2d 3e 69 49 6e 55 73 65 4d 4d 20 26 26 20 70 2d  ->iInUseMM && p-
5e90: 3e 69 49 6e 55 73 65 44 42 3d 3d 31 20 29 7b 0a  >iInUseDB==1 ){.
5ea0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d  #ifndef SQLITE_M
5eb0: 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 20 20 20 20  UTEX_NOOP.      
5ec0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
5ed0: 75 74 65 78 3b 0a 20 20 20 20 20 20 6d 75 74 65  utex;.      mute
5ee0: 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
5ef0: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
5f00: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32  UTEX_STATIC_MEM2
5f10: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
5f20: 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b  p->iInUseDB = 0;
5f30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
5f40: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
5f50: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e 55  );.      p->iInU
5f60: 73 65 44 42 20 3d 20 31 3b 0a 20 20 20 20 20 20  seDB = 1;.      
5f70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
5f80: 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 20 20  ave(mutex);.    
5f90: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
5fa0: 3e 69 49 6e 55 73 65 4d 4d 3d 3d 30 20 29 3b 0a  >iInUseMM==0 );.
5fb0: 20 20 7d 0a 20 20 73 74 61 74 69 63 20 76 6f 69    }.  static voi
5fc0: 64 20 70 61 67 65 72 4c 65 61 76 65 28 50 61 67  d pagerLeave(Pag
5fd0: 65 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69  er *p){.    p->i
5fe0: 49 6e 55 73 65 44 42 2d 2d 3b 0a 20 20 20 20 61  InUseDB--;.    a
5ff0: 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73 65  ssert( p->iInUse
6000: 44 42 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  DB>=0 );.  }.#el
6010: 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
6020: 72 45 6e 74 65 72 28 58 29 0a 23 20 64 65 66 69  rEnter(X).# defi
6030: 6e 65 20 70 61 67 65 72 4c 65 61 76 65 28 58 29  ne pagerLeave(X)
6040: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
6050: 64 64 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  dd page pPg to t
6060: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
6070: 6e 6b 65 64 20 6c 69 73 74 20 6d 61 6e 61 67 65  nked list manage
6080: 64 20 62 79 20 73 74 72 75 63 74 75 72 65 0a 2a  d by structure.*
6090: 2a 20 70 4c 69 73 74 20 28 70 50 67 20 62 65 63  * pList (pPg bec
60a0: 6f 6d 65 73 20 74 68 65 20 6c 61 73 74 20 65 6e  omes the last en
60b0: 74 72 79 20 69 6e 20 74 68 65 20 6c 69 73 74 20  try in the list 
60c0: 2d 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  - the most recen
60d0: 74 6c 79 20 0a 2a 2a 20 75 73 65 64 29 2e 20 41  tly .** used). A
60e0: 72 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68  rgument pLink sh
60f0: 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69  ould point to ei
6100: 74 68 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f  ther pPg->free o
6110: 72 20 70 50 67 2d 3e 67 66 72 65 65 2c 0a 2a 2a  r pPg->gfree,.**
6120: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
6130: 65 74 68 65 72 20 70 50 67 20 69 73 20 62 65 69  ether pPg is bei
6140: 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ng added to the 
6150: 70 61 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f  pager-specific o
6160: 72 0a 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52 55 20  r.** global LRU 
6170: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
6180: 76 6f 69 64 20 6c 69 73 74 41 64 64 28 50 61 67  void listAdd(Pag
6190: 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74  erLruList *pList
61a0: 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a  , PagerLruLink *
61b0: 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50  pLink, PgHdr *pP
61c0: 67 29 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65  g){.  pLink->pNe
61d0: 78 74 20 3d 20 30 3b 0a 20 20 70 4c 69 6e 6b 2d  xt = 0;.  pLink-
61e0: 3e 70 50 72 65 76 20 3d 20 70 4c 69 73 74 2d 3e  >pPrev = pList->
61f0: 70 4c 61 73 74 3b 0a 0a 23 69 66 64 65 66 20 53  pLast;..#ifdef S
6200: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
6210: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
6220: 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26   assert(pLink==&
6230: 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69  pPg->free || pLi
6240: 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29  nk==&pPg->gfree)
6250: 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b  ;.  assert(pLink
6260: 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c  ==&pPg->gfree ||
6270: 20 70 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33   pList!=&sqlite3
6280: 4c 72 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65  LruPageList);.#e
6290: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4c 69 73  ndif..  if( pLis
62a0: 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20  t->pLast ){.    
62b0: 69 6e 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72  int iOff = (char
62c0: 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72   *)pLink - (char
62d0: 20 2a 29 70 50 67 3b 0a 20 20 20 20 50 61 67 65   *)pPg;.    Page
62e0: 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 61 73 74 4c  rLruLink *pLastL
62f0: 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c  ink = (PagerLruL
6300: 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70  ink *)(&((u8 *)p
6310: 4c 69 73 74 2d 3e 70 4c 61 73 74 29 5b 69 4f 66  List->pLast)[iOf
6320: 66 5d 29 3b 0a 20 20 20 20 70 4c 61 73 74 4c 69  f]);.    pLastLi
6330: 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 50 67 3b  nk->pNext = pPg;
6340: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
6350: 73 65 72 74 28 21 70 4c 69 73 74 2d 3e 70 46 69  sert(!pList->pFi
6360: 72 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d  rst);.    pList-
6370: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20  >pFirst = pPg;. 
6380: 20 7d 0a 0a 20 20 70 4c 69 73 74 2d 3e 70 4c 61   }..  pList->pLa
6390: 73 74 20 3d 20 70 50 67 3b 0a 20 20 69 66 28 20  st = pPg;.  if( 
63a0: 21 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79  !pList->pFirstSy
63b0: 6e 63 65 64 20 26 26 20 70 50 67 2d 3e 6e 65 65  nced && pPg->nee
63c0: 64 53 79 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20  dSync==0 ){.    
63d0: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e  pList->pFirstSyn
63e0: 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d  ced = pPg;.  }.}
63f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 70  ../*.** Remove p
6400: 50 67 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  Pg from the list
6410: 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65 20   managed by the 
6420: 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
6430: 64 20 74 6f 20 62 79 20 70 4c 69 73 74 2e 0a 2a  d to by pList..*
6440: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c  *.** Argument pL
6450: 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74  ink should point
6460: 20 74 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e   to either pPg->
6470: 66 72 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72  free or pPg->gfr
6480: 65 65 2c 20 64 65 70 65 6e 64 69 6e 67 20 0a 2a  ee, depending .*
6490: 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67  * on whether pPg
64a0: 20 69 73 20 62 65 69 6e 67 20 61 64 64 65 64 20   is being added 
64b0: 74 6f 20 74 68 65 20 70 61 67 65 72 2d 73 70 65  to the pager-spe
64c0: 63 69 66 69 63 20 6f 72 20 67 6c 6f 62 61 6c 20  cific or global 
64d0: 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  LRU list..*/.sta
64e0: 74 69 63 20 76 6f 69 64 20 6c 69 73 74 52 65 6d  tic void listRem
64f0: 6f 76 65 28 50 61 67 65 72 4c 72 75 4c 69 73 74  ove(PagerLruList
6500: 20 2a 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72   *pList, PagerLr
6510: 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67  uLink *pLink, Pg
6520: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
6530: 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29   iOff = (char *)
6540: 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29  pLink - (char *)
6550: 70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  pPg;..#ifdef SQL
6560: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
6570: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61  Y_MANAGEMENT.  a
6580: 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50  ssert(pLink==&pP
6590: 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b  g->free || pLink
65a0: 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a  ==&pPg->gfree);.
65b0: 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d    assert(pLink==
65c0: 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70  &pPg->gfree || p
65d0: 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72  List!=&sqlite3Lr
65e0: 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64  uPageList);.#end
65f0: 69 66 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d 70  if..  if( pPg==p
6600: 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 29 7b 0a  List->pFirst ){.
6610: 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73      pList->pFirs
6620: 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74  t = pLink->pNext
6630: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d  ;.  }.  if( pPg=
6640: 3d 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b  =pList->pLast ){
6650: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73  .    pList->pLas
6660: 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76  t = pLink->pPrev
6670: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e  ;.  }.  if( pLin
6680: 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  k->pPrev ){.    
6690: 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 50  PagerLruLink *pP
66a0: 72 65 76 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72  revLink = (Pager
66b0: 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38  LruLink *)(&((u8
66c0: 20 2a 29 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 29   *)pLink->pPrev)
66d0: 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70 50 72  [iOff]);.    pPr
66e0: 65 76 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20  evLink->pNext = 
66f0: 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLink->pNext;.  
6700: 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70  }.  if( pLink->p
6710: 4e 65 78 74 20 29 7b 0a 20 20 20 20 50 61 67 65  Next ){.    Page
6720: 72 4c 72 75 4c 69 6e 6b 20 2a 70 4e 65 78 74 4c  rLruLink *pNextL
6730: 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c  ink = (PagerLruL
6740: 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70  ink *)(&((u8 *)p
6750: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69 4f 66  Link->pNext)[iOf
6760: 66 5d 29 3b 0a 20 20 20 20 70 4e 65 78 74 4c 69  f]);.    pNextLi
6770: 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 6e  nk->pPrev = pLin
6780: 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  k->pPrev;.  }.  
6790: 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e  if( pPg==pList->
67a0: 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
67b0: 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70      PgHdr *p = p
67c0: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Link->pNext;.   
67d0: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
67e0: 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
67f0: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a    PagerLruLink *
6800: 70 4c 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69  pL = (PagerLruLi
6810: 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 29  nk *)(&((u8 *)p)
6820: 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 70  [iOff]);.      p
6830: 20 3d 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pL->pNext;.  
6840: 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70    }.    pList->p
6850: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b  FirstSynced = p;
6860: 0a 20 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d 3e 70  .  }..  pLink->p
6870: 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50  Next = pLink->pP
6880: 72 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a  rev = 0;.}../* .
6890: 2a 2a 20 41 64 64 20 70 61 67 65 20 70 50 67 20  ** Add page pPg 
68a0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66  to the list of f
68b0: 72 65 65 20 70 61 67 65 73 20 66 6f 72 20 74 68  ree pages for th
68c0: 65 20 70 61 67 65 72 2e 20 49 66 20 0a 2a 2a 20  e pager. If .** 
68d0: 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e  memory-managemen
68e0: 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c  t is enabled, al
68f0: 73 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  so add the page 
6900: 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 0a 2a  to the global .*
6910: 2a 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70  * list of free p
6920: 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ages..*/.static 
6930: 76 6f 69 64 20 6c 72 75 4c 69 73 74 41 64 64 28  void lruListAdd(
6940: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c  PgHdr *pPg){.  l
6950: 69 73 74 41 64 64 28 26 70 50 67 2d 3e 70 50 61  istAdd(&pPg->pPa
6960: 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e  ger->lru, &pPg->
6970: 66 72 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64  free, pPg);.#ifd
6980: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6990: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
69a0: 4e 54 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70  NT.  if( !pPg->p
69b0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
69c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
69d0: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f  x_enter(sqlite3_
69e0: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
69f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
6a00: 4c 52 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 41  LRU));.    listA
6a10: 64 64 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61  dd(&sqlite3LruPa
6a20: 67 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66  geList, &pPg->gf
6a30: 72 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73  ree, pPg);.    s
6a40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6a50: 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ve(sqlite3_mutex
6a60: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
6a70: 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29  TEX_STATIC_LRU))
6a80: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
6a90: 2f 2a 20 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 61  /* .** Remove pa
6aa0: 67 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20  ge pPg from the 
6ab0: 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  list of free pag
6ac0: 65 73 20 66 6f 72 20 74 68 65 20 61 73 73 6f 63  es for the assoc
6ad0: 69 61 74 65 64 20 70 61 67 65 72 2e 0a 2a 2a 20  iated pager..** 
6ae0: 49 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65  If memory-manage
6af0: 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c  ment is enabled,
6b00: 20 61 6c 73 6f 20 72 65 6d 6f 76 65 20 70 50 67   also remove pPg
6b10: 20 66 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61 6c   from the global
6b20: 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 66 72 65 65   list.** of free
6b30: 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   pages..*/.stati
6b40: 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 52 65  c void lruListRe
6b50: 6d 6f 76 65 28 50 67 48 64 72 20 2a 70 50 67 29  move(PgHdr *pPg)
6b60: 7b 0a 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26  {.  listRemove(&
6b70: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75  pPg->pPager->lru
6b80: 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50  , &pPg->free, pP
6b90: 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g);.#ifdef SQLIT
6ba0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
6bb0: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28  MANAGEMENT.  if(
6bc0: 20 21 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d   !pPg->pPager->m
6bd0: 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  emDb ){.    sqli
6be0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
6bf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
6c00: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
6c10: 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
6c20: 20 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 73     listRemove(&s
6c30: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
6c40: 74 2c 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20  t, &pPg->gfree, 
6c50: 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pPg);.    sqlite
6c60: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
6c70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
6c80: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6c90: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d  TATIC_LRU));.  }
6ca0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a  .#endif.}../* .*
6cb0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6cc0: 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 61  is called just a
6cd0: 66 74 65 72 20 74 68 65 20 6e 65 65 64 53 79 6e  fter the needSyn
6ce0: 63 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20  c flag has been 
6cf0: 63 6c 65 61 72 65 64 0a 2a 2a 20 66 72 6f 6d 20  cleared.** from 
6d00: 61 6c 6c 20 70 61 67 65 73 20 6d 61 6e 61 67 65  all pages manage
6d10: 64 20 62 79 20 70 50 61 67 65 72 20 28 75 73 75  d by pPager (usu
6d20: 61 6c 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ally because the
6d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
6d40: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
6d50: 79 6e 63 65 64 29 2e 20 49 74 20 75 70 64 61 74  ynced). It updat
6d60: 65 73 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6c  es the pPager->l
6d70: 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  ru.pFirstSynced 
6d80: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 61 6e 64 2c  variable.** and,
6d90: 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67   if memory-manag
6da0: 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64  ement is enabled
6db0: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 4c 72 75  , the sqlite3Lru
6dc0: 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53  PageList.pFirstS
6dd0: 79 6e 63 65 64 0a 2a 2a 20 76 61 72 69 61 62 6c  ynced.** variabl
6de0: 65 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69  e also..*/.stati
6df0: 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 53 65  c void lruListSe
6e00: 74 46 69 72 73 74 53 79 6e 63 65 64 28 50 61 67  tFirstSynced(Pag
6e10: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70  er *pPager){.  p
6e20: 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
6e30: 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  tSynced = pPager
6e40: 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a 23 69  ->lru.pFirst;.#i
6e50: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6e60: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
6e70: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 67  MENT.  if( !pPag
6e80: 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
6e90: 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 73   PgHdr *p;.    s
6ea0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
6eb0: 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  er(sqlite3_mutex
6ec0: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
6ed0: 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29  TEX_STATIC_LRU))
6ee0: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
6ef0: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70  te3LruPageList.p
6f00: 46 69 72 73 74 3b 20 70 20 26 26 20 70 2d 3e 6e  First; p && p->n
6f10: 65 65 64 53 79 6e 63 3b 20 70 3d 70 2d 3e 67 66  eedSync; p=p->gf
6f20: 72 65 65 2e 70 4e 65 78 74 29 3b 0a 20 20 20 20  ree.pNext);.    
6f30: 61 73 73 65 72 74 28 70 3d 3d 70 50 61 67 65 72  assert(p==pPager
6f40: 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
6f50: 65 64 20 7c 7c 20 70 3d 3d 73 71 6c 69 74 65 33  ed || p==sqlite3
6f60: 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72  LruPageList.pFir
6f70: 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 20 20 73  stSynced);.    s
6f80: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
6f90: 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  t.pFirstSynced =
6fa0: 20 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   p;.    sqlite3_
6fb0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
6fc0: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
6fd0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
6fe0: 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23  TIC_LRU));.  }.#
6ff0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
7000: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 70 61  eturn true if pa
7010: 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65  ge *pPg has alre
7020: 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
7030: 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
7040: 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72  t.** journal (or
7050: 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73   statement snaps
7060: 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63 72 65  hot has been cre
7070: 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73  ated, if *pPg is
7080: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69   part.** of an i
7090: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
70a0: 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
70b0: 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e  t pageInStatemen
70c0: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
70d0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
70e0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
70f0: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
7100: 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
7110: 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
7120: 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65  r)->inStmt;.  }e
7130: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
7140: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
7150: 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  t(pPager->pInStm
7160: 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
7170: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
7180: 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ge the size of t
7190: 68 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61  he pager hash ta
71a0: 62 6c 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73  ble to N.  N mus
71b0: 74 20 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t be a power.** 
71c0: 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69  of two..*/.stati
71d0: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
71e0: 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50  ize_hash_table(P
71f0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
7200: 74 20 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a  t N){.  PgHdr **
7210: 61 48 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61  aHash, *pPg;.  a
7220: 73 73 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e  ssert( N>0 && (N
7230: 26 28 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 23 69  &(N-1))==0 );.#i
7240: 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 4c 4c  fdef SQLITE_MALL
7250: 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 0a 20 20  OC_SOFT_LIMIT.  
7260: 69 66 28 20 4e 2a 73 69 7a 65 6f 66 28 61 48 61  if( N*sizeof(aHa
7270: 73 68 5b 30 5d 29 3e 53 51 4c 49 54 45 5f 4d 41  sh[0])>SQLITE_MA
7280: 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 20  LLOC_SOFT_LIMIT 
7290: 29 7b 0a 20 20 20 20 4e 20 3d 20 53 51 4c 49 54  ){.    N = SQLIT
72a0: 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49  E_MALLOC_SOFT_LI
72b0: 4d 49 54 2f 73 69 7a 65 6f 66 28 61 48 61 73 68  MIT/sizeof(aHash
72c0: 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [0]);.  }.  if( 
72d0: 4e 3d 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  N==pPager->nHash
72e0: 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69   ) return;.#endi
72f0: 66 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  f.  pagerLeave(p
7300: 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
7310: 33 46 61 75 6c 74 42 65 6e 69 67 6e 28 53 51 4c  3FaultBenign(SQL
7320: 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f  ITE_FAULTINJECTO
7330: 52 5f 4d 41 4c 4c 4f 43 2c 20 70 50 61 67 65 72  R_MALLOC, pPager
7340: 2d 3e 61 48 61 73 68 21 3d 30 29 3b 0a 20 20 61  ->aHash!=0);.  a
7350: 48 61 73 68 20 3d 20 73 71 6c 69 74 65 33 4d 61  Hash = sqlite3Ma
7360: 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
7370: 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a  (aHash[0])*N );.
7380: 20 20 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65    sqlite3FaultBe
7390: 6e 69 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c  nign(SQLITE_FAUL
73a0: 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43  TINJECTOR_MALLOC
73b0: 2c 20 30 29 3b 0a 20 20 70 61 67 65 72 45 6e 74  , 0);.  pagerEnt
73c0: 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
73d0: 28 20 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ( aHash==0 ){.  
73e0: 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
73f0: 72 65 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e  rehash is not an
7400: 20 65 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f   error.  It is o
7410: 6e 6c 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  nly a performanc
7420: 65 20 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65  e hit. */.    re
7430: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
7440: 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
7450: 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65  >aHash);.  pPage
7460: 72 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20  r->nHash = N;.  
7470: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20  pPager->aHash = 
7480: 61 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 50 67  aHash;.  for(pPg
7490: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
74a0: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
74b0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20  xtAll){.    int 
74c0: 68 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  h;.    if( pPg->
74d0: 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pgno==0 ){.     
74e0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
74f0: 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50  extHash==0 && pP
7500: 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  g->pPrevHash==0 
7510: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
7520: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 20 3d  e;.    }.    h =
7530: 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d   pPg->pgno & (N-
7540: 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  1);.    pPg->pNe
7550: 78 74 48 61 73 68 20 3d 20 61 48 61 73 68 5b 68  xtHash = aHash[h
7560: 5d 3b 0a 20 20 20 20 69 66 28 20 61 48 61 73 68  ];.    if( aHash
7570: 5b 68 5d 20 29 7b 0a 20 20 20 20 20 20 61 48 61  [h] ){.      aHa
7580: 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
7590: 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
75a0: 20 20 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67    aHash[h] = pPg
75b0: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
75c0: 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Hash = 0;.  }.}.
75d0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
75e0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
75f0: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
7600: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
7610: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
7620: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
7630: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
7640: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
7650: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
7660: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
7670: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
7680: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
7690: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
76a0: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
76b0: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
76c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
76d0: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
76e0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
76f0: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
7700: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
7710: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
7720: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
7730: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
7740: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
7750: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
7760: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
7770: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
7780: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
7790: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
77a0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
77b0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
77c0: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
77d0: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
77e0: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
77f0: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
7800: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
7810: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
7820: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
7830: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
7840: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
7850: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
7860: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
7870: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
7880: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
7890: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
78a0: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
78b0: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
78c0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
78d0: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
78e0: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
78f0: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
7900: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
7910: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
7920: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
7930: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
7940: 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73  * If file pFd is
7950: 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69   open, call sqli
7960: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e  te3OsUnlock() on
7970: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   it..*/.static i
7980: 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  nt osUnlock(sqli
7990: 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69  te3_file *pFd, i
79a0: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28  nt eLock){.  if(
79b0: 20 21 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20   !pFd->pMethods 
79c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
79d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
79e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55  eturn sqlite3OsU
79f0: 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b  nlock(pFd, eLock
7a00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
7a10: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
7a20: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
7a30: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
7a40: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
7a50: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  n.** can be used
7a60: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72   with this pager
7a70: 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  . The optimizati
7a80: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
7a90: 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68  f:.**.**  (a) th
7aa0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
7ab0: 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72   by OsDeviceChar
7ac0: 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e  acteristics() in
7ad0: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
7ae0: 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20       a database 
7af0: 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74  page may be writ
7b00: 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20  ten atomically, 
7b10: 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20  and.**  (b) the 
7b20: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
7b30: 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  y OsSectorSize()
7b40: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
7b50: 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74   equal.**      t
7b60: 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  o the page size.
7b70: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  .**.** If the op
7b80: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f  timization canno
7b90: 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20  t be used, 0 is 
7ba0: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
7bb0: 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20  can be used,.** 
7bc0: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
7bd0: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73  eturned is the s
7be0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
7bf0: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a  al file when it.
7c00: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c  ** contains roll
7c10: 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78  back data for ex
7c20: 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a  actly one page..
7c30: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
7c40: 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
7c50: 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20  RITE.static int 
7c60: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50  jrnlBufferSize(P
7c70: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
7c80: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
7c90: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
7ca0: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
7cb0: 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20    int nSector;  
7cc0: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
7cd0: 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  ze */.  int nPag
7ce0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  e;        /* Pag
7cf0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69  e size */.  sqli
7d00: 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70  te3_file *fd = p
7d10: 50 61 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66  Pager->fd;..  if
7d20: 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
7d30: 7b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74  {.    dc = sqlit
7d40: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
7d50: 74 65 72 69 73 74 69 63 73 28 66 64 29 3b 0a 20  teristics(fd);. 
7d60: 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c     nSector = sql
7d70: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
7d80: 28 66 64 29 3b 0a 20 20 20 20 6e 50 61 67 65 20  (fd);.    nPage 
7d90: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
7da0: 7a 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ze;.  }..  asser
7db0: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
7dc0: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
7dd0: 38 29 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51  8));.  assert(SQ
7de0: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
7df0: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
7e00: 29 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70  );..  if( !fd->p
7e10: 4d 65 74 68 6f 64 73 20 7c 7c 20 28 64 63 26 28  Methods || (dc&(
7e20: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
7e30: 4d 49 43 7c 28 6e 50 61 67 65 3e 3e 38 29 29 26  MIC|(nPage>>8))&
7e40: 26 6e 53 65 63 74 6f 72 3c 3d 6e 50 61 67 65 29  &nSector<=nPage)
7e50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4a   ){.    return J
7e60: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
7e70: 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
7e80: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
7e90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
7ea0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
7eb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
7ec0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
7ed0: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  en an error occu
7ee0: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  rs within the pa
7ef0: 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65  ger.** code. The
7f00: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
7f10: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
7f20: 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
7f30: 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ure, the.** seco
7f40: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
7f50: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
7f60: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
7f70: 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
7f80: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
7f90: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
7fa0: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
7fb0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
7fc0: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
7fd0: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
7fe0: 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
7ff0: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
8000: 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49  CORRUPT, or SQLI
8010: 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65  TE_FULL.** the e
8020: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
8030: 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74  sistent. Until t
8040: 68 65 20 70 65 72 73 69 73 74 65 6e 20 65 72 72  he persisten err
8050: 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a  or is cleared,.*
8060: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49  * subsequent API
8070: 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50   calls on this P
8080: 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69  ager will immedi
8090: 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65  ately return the
80a0: 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20   same .** error 
80b0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65  code..**.** A pe
80c0: 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 69  rsistent error i
80d0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
80e0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
80f0: 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a  e pager-cache .*
8100: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  * cannot be trus
8110: 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20  ted. This state 
8120: 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62  can be cleared b
8130: 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  y completely dis
8140: 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20  carding .** the 
8150: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
8160: 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20  pager-cache. If 
8170: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
8180: 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a  s active when.**
8190: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
81a0: 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 74  error occured, t
81b0: 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  hen the rollback
81c0: 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65   journal may nee
81d0: 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61  d.** to be repla
81e0: 79 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  yed..*/.static v
81f0: 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
8200: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b  (Pager *pPager);
8210: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
8220: 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70  r_error(Pager *p
8230: 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a  Pager, int rc){.
8240: 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26    int rc2 = rc &
8250: 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28   0xff;.  assert(
8260: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
8270: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
8280: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
8290: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
82a0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
82b0: 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
82c0: 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
82d0: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
82e0: 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53    if(.    rc2==S
82f0: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
8300: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f    rc2==SQLITE_IO
8310: 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d  ERR ||.    rc2==
8320: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20  SQLITE_CORRUPT. 
8330: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
8340: 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
8350: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
8360: 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
8370: 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  K && pPager->nRe
8380: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  f==0 ){.      /*
8390: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
83a0: 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65   already unlocke
83b0: 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e  d, call pager_un
83c0: 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20  lock() now to.  
83d0: 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65      ** clear the
83e0: 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64   error state and
83f0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
8400: 20 70 61 67 65 72 2d 63 61 63 68 65 20 69 73 20   pager-cache is 
8410: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65  .      ** comple
8420: 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20  tely empty..    
8430: 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72    */.      pager
8440: 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
8450: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8460: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8470: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
8480: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
8490: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
84a0: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
84b0: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
84c0: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
84d0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
84e0: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
84f0: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
8500: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
8510: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
8520: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
8530: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
8540: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
8550: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
8560: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
8570: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
8580: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
8590: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
85a0: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
85b0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
85c0: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
85d0: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
85e0: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
85f0: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
8600: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
8610: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
8620: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
8630: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
8640: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
8650: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8660: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8670: 20 20 20 20 20 20 20 20 20 20 20 28 75 6e 73 69             (unsi
8680: 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44  gned char *)PGHD
8690: 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29  R_TO_DATA(pPage)
86a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
86b0: 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f  CHECK_PAGE macro
86c0: 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20   takes a PgHdr* 
86d0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
86e0: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
86f0: 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69  PAGES.** is defi
8700: 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20  ned, and NDEBUG 
8710: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20  is not defined, 
8720: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
8730: 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20  ement checks.** 
8740: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
8750: 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72   either dirty or
8760: 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74   still matches t
8770: 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61  he calculated pa
8780: 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66  ge-hash..*/.#def
8790: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
87a0: 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73  ) checkPage(x).s
87b0: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
87c0: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
87d0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
87e0: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
87f0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
8800: 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61  >pageHash || pPa
8810: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
8820: 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69  MEMDB || pPg->di
8830: 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50  rty || .      pP
8840: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
8850: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
8860: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
8870: 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68  fine pager_datah
8880: 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66  ash(X,Y)  0.#def
8890: 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61  ine pager_pageha
88a0: 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65  sh(X)  0.#define
88b0: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23   CHECK_PAGE(x).#
88c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  endif../*.** Whe
88d0: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
88e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
88f0: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
8900: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
8910: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
8920: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
8930: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
8940: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
8950: 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65  e and .** writte
8960: 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  n into memory su
8970: 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 63 61  pplied by the ca
8980: 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61  ller. .**.** zMa
8990: 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20  ster must point 
89a0: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
89b0: 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20  t least nMaster 
89c0: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
89d0: 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  by.** the caller
89e0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
89f0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
8a00: 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e  athname+1 (to en
8a10: 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  sure there is.**
8a20: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
8a30: 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   write the maste
8a40: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e  r journal name).
8a50: 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   If the master j
8a60: 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69  ournal.** name i
8a70: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
8a80: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61   longer than nMa
8a90: 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c  ster bytes (incl
8aa0: 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74  uding a.** nul-t
8ab0: 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e  erminator), then
8ac0: 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64   this is handled
8ad0: 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72   as if no master
8ae0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a   journal name.**
8af0: 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e   were present in
8b00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
8b10: 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72  .** If no master
8b20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
8b30: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 7a 4d  me is present zM
8b40: 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20  aster[0] is set 
8b50: 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  to 0 and.** SQLI
8b60: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
8b70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
8b80: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
8b90: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
8ba0: 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74  rnl, char *zMast
8bb0: 65 72 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72 29  er, int nMaster)
8bc0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  {.  int rc;.  u3
8bd0: 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a  2 len;.  i64 szJ
8be0: 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20  ;.  u32 cksum;. 
8bf0: 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e   int i;.  unsign
8c00: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
8c10: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
8c20: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
8c30: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d   header */..  zM
8c40: 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b  aster[0] = '\0';
8c50: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
8c60: 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c  OsFileSize(pJrnl
8c70: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
8c80: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
8c90: 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20  szJ<16 ) return 
8ca0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
8cb0: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
8cc0: 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69  J-16, &len);.  i
8cd0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8ce0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8cf0: 20 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65   if( len>=nMaste
8d00: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
8d10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
8d20: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
8d30: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c  s(pJrnl, szJ-12,
8d40: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20   &cksum);.  if( 
8d50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8d60: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
8d70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
8d80: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
8d90: 38 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28  8, szJ-8);.  if(
8da0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
8db0: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
8dc0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
8dd0: 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  8) ) return rc;.
8de0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8df0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
8e00: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
8e10: 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  6-len);.  if( rc
8e20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8e30: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8e40: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
8e50: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53   = '\0';..  /* S
8e60: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
8e70: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
8e80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
8e90: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  me */.  for(i=0;
8ea0: 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20   i<len; i++){.  
8eb0: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
8ec0: 65 72 5b 69 5d 3b 0a 20 20 20 7d 0a 20 20 69 66  er[i];.   }.  if
8ed0: 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f  ( cksum ){.    /
8ee0: 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75  * If the checksu
8ef0: 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70  m doesn't add up
8f00: 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f  , then one or mo
8f10: 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73  re of the disk s
8f20: 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f  ectors.    ** co
8f30: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73  ntaining the mas
8f40: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8f50: 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65  name is corrupte
8f60: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20  d. This means.  
8f70: 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20    ** definitely 
8f80: 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75  roll back, so ju
8f90: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
8fa0: 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61  _OK and report a
8fb0: 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61   (nul).    ** ma
8fc0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
8fd0: 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ename..    */.  
8fe0: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
8ff0: 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72  \0';.  }.   .  r
9000: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  .}../*.** Seek t
9020: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9030: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
9040: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
9050: 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a  undary where a.*
9060: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
9070: 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20   may be read or 
9080: 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a  written. Pager.j
9090: 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64  ournalOff is upd
90a0: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
90b0: 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74   new seek offset
90c0: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
90d0: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
90e0: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75   512:.**.** Inpu
90f0: 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20  t Offset        
9100: 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66        Output Off
9110: 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  set.** ---------
9120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
9140: 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  * 0             
9150: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
9160: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
9170: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
9180: 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20  * 100           
9190: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
91a0: 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20  ** 2000         
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34               204
91c0: 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20  8.** .*/.static 
91d0: 76 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  void seekJournal
91e0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
91f0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
9200: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
9210: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9220: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
9230: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
9240: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
9250: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
9260: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
9270: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
9280: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
9290: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
92a0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
92b0: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
92c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
92d0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
92e0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
92f0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
9300: 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a  alOff = offset;.
9310: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a  }../*.** Write z
9320: 65 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68 65  eros over the he
9330: 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
9340: 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
9350: 68 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65 63  has the.** effec
9360: 74 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69 6e  t of invalidatin
9370: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
9380: 6c 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e  le and committin
9390: 67 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  g the.** transac
93a0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
93b0: 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  int zeroJournalH
93c0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
93d0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
93e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
93f0: 20 7a 65 72 6f 48 64 72 5b 32 38 5d 3b 0a 0a 20   zeroHdr[28];.. 
9400: 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f   IOTRACE(("JZERO
9410: 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  HDR %p\n", pPage
9420: 72 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r)).  rc = sqlit
9430: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
9440: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
9450: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
9460: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
9470: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9480: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
9490: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
94a0: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
94b0: 4f 4e 4c 59 20 7c 20 70 50 61 67 65 72 2d 3e 73  ONLY | pPager->s
94c0: 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a  ync_flags);.  }.
94d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
94e0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
94f0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
9500: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
9510: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
9520: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
9530: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
9540: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
9550: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
9560: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
9570: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
9580: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
9590: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
95a0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
95b0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
95c0: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
95d0: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
95e0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
95f0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
9600: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
9610: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
9620: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
9630: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
9640: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
9650: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
9660: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
9670: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
9680: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
9690: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
96a0: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
96b0: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
96c0: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
96d0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
96e0: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
96f0: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
9700: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
9710: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
9720: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
9730: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
9740: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
9750: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
9760: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
9770: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9780: 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20  char *zHeader = 
9790: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
97a0: 65 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  e;.  int nHeader
97b0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
97c0: 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  ize;.  int nWrit
97d0: 65 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65  e;..  if( nHeade
97e0: 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r>JOURNAL_HDR_SZ
97f0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
9800: 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41  nHeader = JOURNA
9810: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9820: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
9830: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d  ger->stmtHdrOff=
9840: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
9850: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70  ->stmtHdrOff = p
9860: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9870: 66 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f  f;.  }..  seekJo
9880: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
9890: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
98a0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
98b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
98c0: 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
98d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
98e0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
98f0: 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  gic));..  /* .  
9900: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
9910: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
9920: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
9930: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
9940: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
9950: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
9960: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
9970: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
9980: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
9990: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
99a0: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
99b0: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
99c0: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
99d0: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
99e0: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
99f0: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
9a00: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
9a10: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
9a20: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
9a30: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
9a40: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
9a50: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
9a60: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
9a70: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
9a80: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
9a90: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
9aa0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
9ab0: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
9ac0: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
9ad0: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
9ae0: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
9af0: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
9b00: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
9b10: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
9b20: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
9b30: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
9b40: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64   failure occured
9b50: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
9b60: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
9b70: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
9b80: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
9b90: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
9ba0: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
9bb0: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
9bc0: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
9bd0: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
9be0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
9bf0: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
9c00: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
9c10: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
9c20: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
9c30: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
9c40: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
9c50: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
9c60: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
9c70: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
9c80: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
9c90: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
9ca0: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
9cb0: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
9cc0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
9cd0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
9ce0: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
9cf0: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
9d00: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b  pPager->noSync);
9d10: 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
9d20: 6e 6f 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28  noSync) .   || (
9d30: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
9d40: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
9d50: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
9d60: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
9d70: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  END) .  ){.    p
9d80: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
9d90: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
9da0: 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66  lMagic)], 0xffff
9db0: 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffff);.  }else{.
9dc0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
9dd0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
9de0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
9df0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
9e00: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
9e10: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
9e20: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
9e30: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
9e40: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9e50: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
9e60: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
9e70: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
9e80: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
9e90: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
9ea0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
9eb0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
9ec0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
9ed0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
9ee0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
9ef0: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
9f00: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f  er->dbSize);.  /
9f10: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
9f20: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
9f30: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
9f40: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
9f50: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
9f60: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
9f70: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
9f80: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
9f90: 3e 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30 20 29  >journalHdr==0 )
9fa0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
9fb0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 70 75  e size */.    pu
9fc0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
9fd0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
9fe0: 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67  Magic)+16], pPag
9ff0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
a000: 20 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69 74 65   }..  for(nWrite
a010: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
a020: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
a030: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a040: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
a050: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
a060: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
a070: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
a080: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
a090: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
a0a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
a0b0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
a0c0: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
a0d0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
a0e0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67  alOff);.    pPag
a0f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
a100: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
a110: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a120: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
a130: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
a140: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
a150: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
a160: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
a170: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
a180: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
a190: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
a1a0: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
a1b0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
a1c0: 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  e. See comments 
a1d0: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
a1e0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
a1f0: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
a200: 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75  on of.** the jou
a210: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
a220: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
a230: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
a240: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e  successfully, *n
a250: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
a260: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
a270: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
a280: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
a290: 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73  r and *dbSize is
a2a0: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
a2b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
a2c0: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
a2d0: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
a2e0: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
a2f0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
a300: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
a310: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
a320: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
a330: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
a340: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
a350: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
a360: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
a370: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
a380: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
a390: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
a3a0: 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
a3b0: 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61  rned and *nRec a
a3c0: 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e  nd *dbSize are n
a3d0: 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52  ot set.  If JOUR
a3e0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
a3f0: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
a400: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
a410: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
a420: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
a430: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
a440: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
a450: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
a460: 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61  r, .  i64 journa
a470: 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e  lSize,.  u32 *pN
a480: 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62  Rec, .  u32 *pDb
a490: 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Size.){.  int rc
a4a0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
a4b0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
a4c0: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
a4d0: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
a4e0: 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f  r */.  i64 jrnlO
a4f0: 66 66 3b 0a 20 20 69 6e 74 20 69 50 61 67 65 53  ff;.  int iPageS
a500: 69 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72  ize;..  seekJour
a510: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
a520: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
a530: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
a540: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
a550: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
a560: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a570: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a  TE_DONE;.  }.  j
a580: 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  rnlOff = pPager-
a590: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
a5a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
a5b0: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
a5c0: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
a5d0: 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29  Magic), jrnlOff)
a5e0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
a5f0: 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66  urn rc;.  jrnlOf
a600: 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67  f += sizeof(aMag
a610: 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63  ic);..  if( memc
a620: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
a630: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
a640: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
a650: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a660: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
a670: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a680: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
a690: 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69  Off, pNRec);.  i
a6a0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a6b0: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
a6c0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
a6d0: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70  d, jrnlOff+4, &p
a6e0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
a6f0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
a700: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
a710: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
a720: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
a730: 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20  +8, pDbSize);.  
a740: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
a750: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
a760: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
a770: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20  fd, jrnlOff+16, 
a780: 28 75 33 32 20 2a 29 26 69 50 61 67 65 53 69 7a  (u32 *)&iPageSiz
a790: 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
a7a0: 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 69  LITE_OK .   && i
a7b0: 50 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 0a 20  PageSize>=512 . 
a7c0: 20 20 26 26 20 69 50 61 67 65 53 69 7a 65 3c 3d    && iPageSize<=
a7d0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
a7e0: 53 49 5a 45 20 0a 20 20 20 26 26 20 28 28 69 50  SIZE .   && ((iP
a7f0: 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65  ageSize-1)&iPage
a800: 53 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b 0a 20  Size)==0 .  ){. 
a810: 20 20 20 75 31 36 20 70 61 67 65 73 69 7a 65 20     u16 pagesize 
a820: 3d 20 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  = iPageSize;.   
a830: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
a840: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
a850: 61 67 65 72 2c 20 26 70 61 67 65 73 69 7a 65 29  ager, &pagesize)
a860: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  ;.  }.  if( rc )
a870: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
a880: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
a890: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
a8a0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
a8b0: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a  lue used by .  *
a8c0: 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
a8d0: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
a8e0: 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
a8f0: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a   journal was.  *
a900: 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  * created by a p
a910: 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61  rocess other tha
a920: 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e  n this one, then
a930: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
a940: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
a950: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
a960: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
a970: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
a980: 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73  .  ** of Pager.s
a990: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
a9a0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
a9b0: 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
a9c0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  ..  */.  rc = re
a9d0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
a9e0: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32  >jfd, jrnlOff+12
a9f0: 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72  , (u32 *)&pPager
aa00: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
aa10: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
aa20: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
aa30: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
aa40: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
aa50: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
aa60: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
aa70: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
aa80: 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
aa90: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
aaa0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
aab0: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
aac0: 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
aad0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
aae0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
aaf0: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
ab00: 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
ab10: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
ab20: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
ab30: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
ab40: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
ab50: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
ab60: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
ab70: 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
ab80: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
ab90: 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
aba0: 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
abb0: 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
abc0: 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74  s:.**.** + 4 byt
abd0: 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
abe0: 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a  O..** + N bytes:
abf0: 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65   length of maste
ac00: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  r journal name..
ac10: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a  ** + 4 bytes: N.
ac20: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61  ** + 4 bytes: Ma
ac30: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
ac40: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b  e checksum..** +
ac50: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
ac60: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
ac70: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
ac80: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
ac90: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
aca0: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
acb0: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
acc0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  al name..**.** I
acd0: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
ace0: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
acf0: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
ad00: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
ad10: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
ad20: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
ad30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ad40: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
ad50: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
ad60: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
ad70: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
ad80: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20  ;.  int len; .  
ad90: 69 6e 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72  int i; .  i64 jr
ada0: 6e 6c 4f 66 66 3b 0a 20 20 75 33 32 20 63 6b 73  nlOff;.  u32 cks
adb0: 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  um = 0;.  char z
adc0: 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  Buf[sizeof(aJour
add0: 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a  nalMagic)+2*4];.
ade0: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
adf0: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
ae00: 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c  ster) return SQL
ae10: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
ae20: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
ae30: 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  ..  len = strlen
ae40: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72  (zMaster);.  for
ae50: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
ae60: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
ae70: 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a  zMaster[i];.  }.
ae80: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
ae90: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
aea0: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
aeb0: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
aec0: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
aed0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
aee0: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
aef0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
af00: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
af10: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
af20: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
af30: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
af40: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
af50: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
af60: 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64     seekJournalHd
af70: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  r(pPager);.  }. 
af80: 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
af90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
afa0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
afb0: 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b  Off += (len+20);
afc0: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
afd0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
afe0: 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52  , jrnlOff, PAGER
aff0: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
b000: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
b010: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
b020: 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d  rc;.  jrnlOff +=
b030: 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   4;..  rc = sqli
b040: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
b050: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
b060: 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a   len, jrnlOff);.
b070: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b080: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
b090: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65  .  jrnlOff += le
b0a0: 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28  n;..  put32bits(
b0b0: 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75  zBuf, len);.  pu
b0c0: 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d  t32bits(&zBuf[4]
b0d0: 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63  , cksum);.  memc
b0e0: 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f  py(&zBuf[8], aJo
b0f0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
b100: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
b110: 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
b120: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
b130: 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73  ->jfd, zBuf, 8+s
b140: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
b150: 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a  gic), jrnlOff);.
b160: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
b170: 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
b180: 53 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72  Sync;.  return r
b190: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
b1a0: 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65  or remove a page
b1b0: 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
b1c0: 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74  f all pages that
b1d0: 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73   are in the.** s
b1e0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
b1f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65  ..**.** The Page
b200: 72 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61  r keeps a separa
b210: 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  te list of pages
b220: 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
b230: 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74  tly in.** the st
b240: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
b250: 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65    This helps the
b260: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
b270: 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75  tCommit().** rou
b280: 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61  tine run MUCH fa
b290: 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d  ster for the com
b2a0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
b2b0: 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a  here are many.**
b2c0: 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79   pages in memory
b2d0: 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20   but only a few 
b2e0: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
b2f0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  ment journal..*/
b300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b310: 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
b320: 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  st(PgHdr *pPg){.
b330: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
b340: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
b350: 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
b360: 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
b370: 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
b380: 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 20    assert( MEMDB 
b390: 29 3b 0a 20 20 69 66 28 20 21 70 48 69 73 74 2d  );.  if( !pHist-
b3a0: 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 61  >inStmt ){.    a
b3b0: 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 50  ssert( pHist->pP
b3c0: 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 48  revStmt==0 && pH
b3d0: 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  ist->pNextStmt==
b3e0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
b3f0: 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ger->pStmt ){.  
b400: 20 20 20 20 50 47 48 44 52 5f 54 4f 5f 48 49 53      PGHDR_TO_HIS
b410: 54 28 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c  T(pPager->pStmt,
b420: 20 70 50 61 67 65 72 29 2d 3e 70 50 72 65 76 53   pPager)->pPrevS
b430: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  tmt = pPg;.    }
b440: 0a 20 20 20 20 70 48 69 73 74 2d 3e 70 4e 65 78  .    pHist->pNex
b450: 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e  tStmt = pPager->
b460: 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 61 67 65  pStmt;.    pPage
b470: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a  r->pStmt = pPg;.
b480: 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
b490: 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 1;.  }.}../*
b4a0: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
b4b0: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
b4c0: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
b4d0: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
b4e0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
b4f0: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
b500: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
b510: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
b520: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
b530: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
b540: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
b550: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65   *p;.  if( pPage
b560: 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65  r->aHash==0 ) re
b570: 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50  turn 0;.  p = pP
b580: 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f  ager->aHash[pgno
b590: 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
b5a0: 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20  h-1)];.  while( 
b5b0: 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67  p && p->pgno!=pg
b5c0: 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d  no ){.    p = p-
b5d0: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
b5e0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
b5f0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69  *.** Clear the i
b600: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
b610: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
b620: 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
b630: 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63  of the pager bac
b640: 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73  k to what it was
b650: 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72   when it was fir
b660: 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41  st.** opened.  A
b670: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ny outstanding p
b680: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
b690: 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75  ated and subsequ
b6a0: 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ent attempts.** 
b6b0: 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20  to access those 
b6c0: 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  pages will likel
b6d0: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  y result in a co
b6e0: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69  redump..*/.stati
b6f0: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
b700: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
b710: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
b720: 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70   *pNext;.  if( p
b730: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
b740: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
b750: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
b760: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
b770: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
b780: 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c  PGFREE %p %d\n",
b790: 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
b7a0: 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  no));.    PAGER_
b7b0: 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
b7c0: 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
b7d0: 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  ;.    pNext = pP
b7e0: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
b7f0: 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70   lruListRemove(p
b800: 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Pg);.    sqlite3
b810: 5f 66 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61  _free(pPg->pData
b820: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
b830: 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
b840: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c  assert(pPager->l
b850: 72 75 2e 70 46 69 72 73 74 3d 3d 30 29 3b 0a 20  ru.pFirst==0);. 
b860: 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
b870: 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
b880: 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70  ==0);.  assert(p
b890: 50 61 67 65 72 2d 3e 6c 72 75 2e 70 4c 61 73 74  Pager->lru.pLast
b8a0: 3d 3d 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ==0);.  pPager->
b8b0: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61  pStmt = 0;.  pPa
b8c0: 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20  ger->pAll = 0;. 
b8d0: 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
b8e0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
b8f0: 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Hash = 0;.  sqli
b900: 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
b910: 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65  >aHash);.  pPage
b920: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
b930: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20  pPager->aHash = 
b940: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
b950: 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f = 0;.}../*.** 
b960: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
b970: 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ase file. .**.**
b980: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
b990: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
b9a0: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
b9b0: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
b9c0: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
b9d0: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
b9e0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
b9f0: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
ba00: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
ba10: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
ba20: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
ba30: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
ba40: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
ba50: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
ba60: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
ba70: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
ba80: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
ba90: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
baa0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
bab0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
bac0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
bad0: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
bae0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
baf0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
bb00: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  veMode ){.    if
bb10: 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
bb20: 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 55 6e 6c    int rc = osUnl
bb30: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
bb40: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
bb50: 69 66 28 20 72 63 20 29 20 70 50 61 67 65 72 2d  if( rc ) pPager-
bb60: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
bb70: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
bb80: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ize = -1;.      
bb90: 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  IOTRACE(("UNLOCK
bba0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
bbb0: 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79  ..      /* Alway
bbc0: 73 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  s close the jour
bbd0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
bbe0: 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
bbf0: 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ase lock..      
bc00: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
bc10: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
bc20: 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
bc30: 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 0a  de=delete might.
bc40: 20 20 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20        ** delete 
bc50: 74 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72 6f  the file out fro
bc60: 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20  m under us..    
bc70: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
bc80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
bc90: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  en ){.        sq
bca0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
bcb0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
bcc0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
bcd0: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  alOpen = 0;.    
bce0: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
bcf0: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
bd00: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
bd10: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49        pPager->pI
bd20: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
bd30: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
bd40: 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
bd50: 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
bd60: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
bd70: 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
bd80: 62 65 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 73  be.      ** trus
bd90: 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
bda0: 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20  e pager file is 
bdb0: 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f  unlocked, the co
bdc0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20  ntents of the.  
bdd0: 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e      ** cache can
bde0: 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61 6e   be discarded an
bdf0: 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
be00: 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e   safely cleared.
be10: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
be20: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
be30: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ode ){.        i
be40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
be50: 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   ) pPager->errCo
be60: 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
be70: 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
be80: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
be90: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
bea0: 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
beb0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
bec0: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74  Close(pPager->st
bed0: 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  fd);.          s
bee0: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
bef0: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53  roy(pPager->pInS
bf00: 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
bf10: 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
bf20: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
bf30: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
bf40: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  tmtOpen = 0;.   
bf50: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
bf60: 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
bf70: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
bf80: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
bf90: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
bfa0: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
bfb0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
bfc0: 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
bfd0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
bfe0: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30  ->origDbSize = 0
bff0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c000: 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
c010: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
c020: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
c030: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
c040: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
c050: 4f 43 4b 3b 0a 20 20 20 20 20 20 70 50 61 67 65  OCK;.      pPage
c060: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
c070: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ne = 0;.    }.  
c080: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  }.}../*.** Execu
c090: 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
c0a0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
c0b0: 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
c0c0: 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
c0d0: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
c0e0: 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
c0f0: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
c100: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a  error state, .**
c110: 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
c120: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f  the rollback..*/
c130: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
c140: 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
c150: 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ack(Pager *p){. 
c160: 20 2f 2a 20 61 73 73 65 72 74 28 20 70 2d 3e 73   /* assert( p->s
c170: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
c180: 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e  RVED || p->journ
c190: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 20 2a 2f 0a  alOpen==0 ); */.
c1a0: 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65    if( p->errCode
c1b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
c1c0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
c1d0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
c1e0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
c1f0: 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61  ack(p);.  }.  pa
c200: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 23  ger_unlock(p);.#
c210: 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
c220: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d  ->errCode || !p-
c230: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
c240: 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  (p->exclusiveMod
c250: 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  e&&!p->journalOf
c260: 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
c270: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
c280: 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d  ->stmtOpen || p-
c290: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
c2a0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
c2b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
c2c0: 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
c2d0: 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f  n.  A transactio
c2e0: 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65 69  n is ended by ei
c2f0: 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54  ther.** a COMMIT
c300: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a   or a ROLLBACK..
c310: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
c320: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
c330: 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73  d, the pager has
c340: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c350: 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20  e open and.** a 
c360: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
c370: 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
c380: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
c390: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
c3a0: 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61  elease.** the da
c3b0: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
c3c0: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
c3d0: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
c3e0: 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a  ace if that is.*
c3f0: 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
c400: 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20  e thing to do.  
c410: 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73  Release locks us
c420: 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72  ually is appropr
c430: 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20  iate,.** unless 
c440: 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73  we are in exclus
c450: 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20  ive access mode 
c460: 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69  or unless this i
c470: 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41  s a .** COMMIT A
c480: 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c  ND BEGIN or ROLL
c490: 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f  BACK AND BEGIN o
c4a0: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
c4b0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
c4c0: 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65 74   is either delet
c4d0: 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e  ed or truncated.
c4e0: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
c4f0: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
c500: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
c510: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
c520: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
c530: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
c540: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
c550: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
c560: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
c570: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
c580: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
c590: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
c5a0: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
c5b0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
c5c0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
c5d0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
c5e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c5f0: 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
c600: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
c610: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
c620: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
c630: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
c640: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c650: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  TE_OK;.  }.  sql
c660: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
c670: 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  mit(pPager);.  i
c680: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
c690: 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e  pen && !pPager->
c6a0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
c6b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
c6c0: 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ose(pPager->stfd
c6d0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
c6e0: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  tmtOpen = 0;.  }
c6f0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
c700: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
c710: 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 65    if( (pPager->e
c720: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 0a  xclusiveMode ||.
c730: 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
c740: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
c750: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
c760: 50 45 52 53 49 53 54 29 20 0a 20 20 20 20 20 20  PERSIST) .      
c770: 20 26 26 20 28 72 63 20 3d 20 7a 65 72 6f 4a 6f   && (rc = zeroJo
c780: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
c790: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
c7a0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
c7b0: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
c7c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
c7d0: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
c7e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c7f0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
c800: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
c810: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
c820: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
c830: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c840: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c850: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
c860: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
c870: 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
c880: 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
c890: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
c8a0: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
c8b0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
c8c0: 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
c8d0: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
c8e0: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
c8f0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
c900: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
c910: 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  l){.      pPg->i
c920: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
c930: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
c940: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
c950: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
c960: 20 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f     pPg->alwaysRo
c970: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64  llback = 0;.#ifd
c980: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
c990: 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
c9a0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
c9b0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
c9c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
c9d0: 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
c9e0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
c9f0: 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
ca00: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
ca10: 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ec = 0;.  }else{
ca20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
ca30: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
ca40: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  =0 );.  }..  if(
ca50: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
ca60: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72  iveMode ){.    r
ca70: 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50  c2 = osUnlock(pP
ca80: 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
ca90: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
caa0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
cab0: 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73  R_SHARED;.  }els
cac0: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74  e if( pPager->st
cad0: 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
cae0: 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  D ){.    pPager-
caf0: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
cb00: 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20  XCLUSIVE;.  }.  
cb10: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
cb20: 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ze = 0;.  pPager
cb30: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
cb40: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
cb50: 79 6e 63 20 3d 20 30 3b 0a 20 20 6c 72 75 4c 69  ync = 0;.  lruLi
cb60: 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64  stSetFirstSynced
cb70: 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
cb80: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
cb90: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
cba0: 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
cbb0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  );.}../*.** Comp
cbc0: 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
cbd0: 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68   checksum for th
cbe0: 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a  e page of data..
cbf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
cc00: 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
cc10: 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79  m.  It is really
cc20: 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
cc30: 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
cc40: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e  initial value an
cc50: 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
cc60: 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e  r.  We experimen
cc70: 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68  ted with.** a ch
cc80: 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e  ecksum of the en
cc90: 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74  tire data, but t
cca0: 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f  hat was found to
ccb0: 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a   be too slow..**
ccc0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
ccd0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
cce0: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62   stored at the b
ccf0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
cd00: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63   and.** the chec
cd10: 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61  ksum is stored a
cd20: 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73  t the end.  This
cd30: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   is important.  
cd40: 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  If journal.** co
cd50: 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
cd60: 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
cd70: 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
cd80: 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f   likely scenario
cd90: 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20  .** is that one 
cda0: 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
cdb0: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
cdc0: 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
cdd0: 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c   It is.** much l
cde0: 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
cdf0: 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
ce00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
ce10: 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
ce20: 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
ce30: 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
ce40: 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
ce50: 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
ce60: 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
ce70: 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
ce80: 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
ce90: 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
cea0: 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ruption..**.** F
ceb0: 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72  IX ME:  Consider
cec0: 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30   adding every 20
ced0: 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65  0th (or so) byte
cee0: 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20   of the data to 
cef0: 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e  the.** checksum.
cf00: 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20    That way if a 
cf10: 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e  single page span
cf20: 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b  s 3 or more disk
cf30: 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20   sectors and.** 
cf40: 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20  only the middle 
cf50: 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70  sector is corrup
cf60: 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c  t, we will still
cf70: 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62   have a reasonab
cf80: 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20  le.** chance of 
cf90: 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63  failing the chec
cfa0: 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65  ksum and thus de
cfb0: 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62  tecting the prob
cfc0: 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lem..*/.static u
cfd0: 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
cfe0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
cff0: 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
d000: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
d010: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
d020: 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65  .  int i = pPage
d030: 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b  r->pageSize-200;
d040: 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
d050: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
d060: 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
d070: 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
d080: 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20  rn cksum;.}../* 
d090: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
d0a0: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion */.static vo
d0b0: 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48  id makeClean(PgH
d0c0: 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  dr*);../*.** Rea
d0d0: 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
d0e0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
d0f0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20   file opened on 
d100: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
d110: 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63  ** jfd.  Playbac
d120: 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e  k this one page.
d130: 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73  .**.** If useCks
d140: 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  um==0 it means t
d150: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  his journal does
d160: 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75   not use checksu
d170: 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a  ms.  Checksums.*
d180: 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69  * are not used i
d190: 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  n statement jour
d1a0: 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61  nals because sta
d1b0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
d1c0: 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74  do not.** need t
d1d0: 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20  o survive power 
d1e0: 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61  failures..*/.sta
d1f0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
d200: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
d210: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
d220: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  , .  sqlite3_fil
d230: 65 20 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f 66  e *jfd,.  i64 of
d240: 66 73 65 74 2c 0a 20 20 69 6e 74 20 75 73 65 43  fset,.  int useC
d250: 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ksum.){.  int rc
d260: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d280: 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
d290: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
d2a0: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
d2b0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
d2c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
d2d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
d2e0: 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
d2f0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d310: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
d320: 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
d330: 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61  cking */.  u8 *a
d340: 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61  Data = (u8 *)pPa
d350: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
d360: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
d370: 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a  e for a page */.
d380: 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73  .  /* useCksum s
d390: 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f  hould be true fo
d3a0: 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  r the main journ
d3b0: 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72  al and false for
d3c0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
d3d0: 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66  journals.  Verif
d3e0: 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61  y that this is a
d3f0: 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20  lways the case. 
d400: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66   */.  assert( jf
d410: 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f  d == (useCksum ?
d420: 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
d430: 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a  Pager->stfd) );.
d440: 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
d450: 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  );..  rc = read3
d460: 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65  2bits(jfd, offse
d470: 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
d480: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d490: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
d4a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
d4b0: 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  (jfd, aData, pPa
d4c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
d4d0: 66 66 73 65 74 2b 34 29 3b 0a 20 20 69 66 28 20  ffset+4);.  if( 
d4e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
d4f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
d500: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
d510: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
d520: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
d530: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
d540: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
d550: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
d560: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
d570: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
d580: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
d590: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
d5a0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
d5b0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
d5c0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
d5d0: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
d5e0: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
d5f0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
d600: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
d610: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
d620: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
d630: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
d640: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
d650: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
d660: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
d670: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
d680: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
d690: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
d6a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
d6b0: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
d6c0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
d6d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d6e0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
d6f0: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
d700: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
d710: 2c 20 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d  , offset+pPager-
d720: 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b  >pageSize+4, &ck
d730: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
d740: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
d750: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
d760: 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69  lOff += 4;.    i
d770: 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  f( pager_cksum(p
d780: 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
d790: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
d7a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
d7b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
d7c0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
d7d0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
d7e0: 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  RVED || pPager->
d7f0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
d800: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
d810: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
d820: 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74  in RESERVED stat
d830: 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
d840: 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
d850: 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
d860: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
d870: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
d880: 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
d890: 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
d8a0: 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
d8b0: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
d8c0: 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
d8d0: 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
d8e0: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
d8f0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
d900: 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
d910: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
d920: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
d930: 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
d940: 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
d950: 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
d960: 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
d970: 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
d980: 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
d990: 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
d9a0: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
d9b0: 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
d9c0: 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
d9d0: 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
d9e0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
d9f0: 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
da00: 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
da10: 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
da20: 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
da30: 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
da40: 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
da50: 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
da60: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
da70: 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
da80: 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
da90: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
daa0: 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a  if it exists.  *
dab0: 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  * and the main f
dac0: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
dad0: 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74   then marked not
dae0: 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a   dirty..  **.  *
daf0: 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
db00: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
db10: 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
db20: 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
db30: 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
db40: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
db50: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
db60: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
db70: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
db80: 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
db90: 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
dba0: 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
dbb0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
dbc0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
dbd0: 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
dbe0: 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
dbf0: 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
dc00: 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
dc10: 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
dc20: 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
dc30: 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
dc40: 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
dc50: 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
dc60: 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
dc70: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
dc80: 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
dc90: 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
dca0: 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
dcb0: 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
dcc0: 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
dcd0: 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
dce0: 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
dcf0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
dd00: 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
dd10: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
dd20: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
dd30: 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
dd40: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
dd50: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
dd60: 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
dd70: 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
dd80: 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
dd90: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
dda0: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
ddb0: 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
ddc0: 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
ddd0: 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
dde0: 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
ddf0: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
de00: 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
de10: 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
de20: 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
de30: 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
de40: 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
de50: 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
de60: 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
de70: 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
de80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
de90: 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
dea0: 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
deb0: 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
dec0: 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
ded0: 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
dee0: 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
def0: 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
df00: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
df10: 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
df20: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
df30: 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
df40: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
df50: 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
df60: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
df70: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
df80: 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54   pgno);.  PAGERT
df90: 52 41 43 45 34 28 22 50 4c 41 59 42 41 43 4b 20  RACE4("PLAYBACK 
dfa0: 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
dfb0: 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
dfc0: 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
dfd0: 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
dfe0: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
dff0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
e000: 20 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20   aData));.  if( 
e010: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
e020: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
e030: 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67  & (pPg==0 || pPg
e040: 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 0a 20  ->needSync==0). 
e050: 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
e060: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
e070: 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  {.    i64 offset
e080: 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
e090: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
e0a0: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
e0b0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
e0c0: 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50  r->fd, aData, pP
e0d0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
e0e0: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  offset);.    if(
e0f0: 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61   pPg ){.      ma
e100: 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
e110: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
e120: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
e130: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
e140: 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
e150: 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
e160: 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
e170: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
e180: 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
e190: 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
e1a0: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
e1b0: 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
e1c0: 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
e1d0: 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
e1e0: 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
e1f0: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
e200: 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
e210: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
e220: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
e230: 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
e240: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
e250: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
e260: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
e270: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20   *pData;.    /* 
e280: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
e290: 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  f==0 || pPg->pgn
e2a0: 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70  o==1 ); */.    p
e2b0: 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
e2c0: 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d  DATA(pPg);.    m
e2d0: 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61  emcpy(pData, aDa
e2e0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
e2f0: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
e300: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
e310: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
e320: 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c  ->xReiniter(pPg,
e330: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
e340: 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
e350: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
e360: 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
e370: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
e380: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
e390: 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  dif.    /* If th
e3a0: 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
e3b0: 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
e3c0: 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
e3d0: 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
e3e0: 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
e3f0: 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
e400: 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
e410: 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
e420: 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
e430: 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
e440: 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
e450: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
e460: 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
e470: 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
e480: 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
e490: 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
e4a0: 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
e4b0: 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
e4c0: 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  3);.  }.  return
e4d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
e4e0: 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
e4f0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
e500: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e510: 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
e520: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
e530: 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
e540: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e550: 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
e560: 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
e570: 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
e580: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
e590: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
e5a0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
e5b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
e5c0: 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
e5d0: 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
e5e0: 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
e5f0: 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
e600: 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
e610: 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
e620: 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
e630: 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
e640: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
e650: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  *.**.** The mast
e660: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
e670: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
e680: 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20  es of all child 
e690: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20  journals..** To 
e6a0: 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72  tell if a master
e6b0: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
e6c0: 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74  deleted, check t
e6d0: 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  o each of the.**
e6e0: 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61   children.  If a
e6f0: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20  ll children are 
e700: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
e710: 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74  r do not refer t
e720: 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74  o.** a different
e730: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c   master journal,
e740: 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65   then this maste
e750: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
e760: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
e770: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
e780: 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70  lmaster(Pager *p
e790: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
e7a0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73  r *zMaster){.  s
e7b0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
e7c0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
e7d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
e7e0: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30   master_open = 0
e7f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
e800: 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c   *pMaster;.  sql
e810: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
e820: 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61  nal;.  char *zMa
e830: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
e840: 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
e850: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e860: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
e870: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
e880: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
e890: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e8a0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  e */..  /* Open 
e8b0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e8c0: 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76  al file exclusiv
e8d0: 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65  ely in case some
e8e0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
e8f0: 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74   ** is running t
e900: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
e910: 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61  . Not that it ma
e920: 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66  kes too much dif
e930: 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  ference..  */.  
e940: 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
e950: 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
e960: 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73  3_malloc(pVfs->s
e970: 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20  zOsFile * 2);.  
e980: 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69  pJournal = (sqli
e990: 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38  te3_file *)(((u8
e9a0: 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56   *)pMaster) + pV
e9b0: 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20  fs->szOsFile);. 
e9c0: 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b   if( !pMaster ){
e9d0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
e9e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
e9f0: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
ea00: 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
ea10: 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
ea20: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
ea30: 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
ea40: 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
ea50: 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
ea60: 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
ea70: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
ea80: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
ea90: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61  master_out;.  ma
eaa0: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a  ster_open = 1;..
eab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
eac0: 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
ead0: 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
eae0: 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
eaf0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
eb00: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
eb10: 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72   if( nMasterJour
eb20: 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61  nal>0 ){.    cha
eb30: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  r *zJournal;.   
eb40: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74   char *zMasterPt
eb50: 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  r = 0;.    int n
eb60: 4d 61 73 74 65 72 50 74 72 20 3d 20 70 50 61 67  MasterPtr = pPag
eb70: 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
eb80: 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20  name+1;..    /* 
eb90: 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
eba0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
ebb0: 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
ebc0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20  btained from.   
ebd0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
ebe0: 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
ebf0: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
ec00: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20  urnal. .    */. 
ec10: 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61     zMasterJourna
ec20: 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  l = (char *)sqli
ec30: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4d 61 73 74  te3_malloc(nMast
ec40: 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
ec50: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28  terPtr);.    if(
ec60: 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
ec70: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
ec80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
ec90: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
eca0: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
ecb0: 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a   zMasterPtr = &z
ecc0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
ecd0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20  asterJournal];. 
ece0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ecf0: 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a  sRead(pMaster, z
ed00: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e  MasterJournal, n
ed10: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
ed20: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
ed30: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
ed40: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
ed50: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a      zJournal = z
ed60: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
ed70: 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72     while( (zJour
ed80: 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
ed90: 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
eda0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
edb0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
edc0: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
edd0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
ede0: 58 49 53 54 53 29 3b 0a 20 20 20 20 20 20 69 66  XISTS);.      if
edf0: 28 20 72 63 21 3d 30 20 26 26 20 72 63 21 3d 31  ( rc!=0 && rc!=1
ee00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
ee10: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
ee20: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  MEM;.        got
ee30: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
ee40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ee50: 66 28 20 72 63 3d 3d 31 20 29 7b 0a 20 20 20 20  f( rc==1 ){.    
ee60: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
ee70: 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
ee80: 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
ee90: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
eea0: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
eeb0: 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
eec0: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
eed0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
eee0: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
eef0: 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
ef00: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
ef10: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ef20: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
ef30: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
ef40: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  ;.        int fl
ef50: 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
ef60: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
ef70: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
ef80: 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72  RNAL);.        r
ef90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
efa0: 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
efb0: 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
efc0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  s, 0);.        i
efd0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
efe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
eff0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
f000: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
f010: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
f020: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
f030: 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
f040: 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
f050: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
f060: 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
f070: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
f080: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f090: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
f0a0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
f0b0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63      }..        c
f0c0: 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
f0d0: 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
f0e0: 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
f0f0: 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69  r)==0;.        i
f100: 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
f110: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
f120: 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
f130: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
f140: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
f150: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
f160: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
f170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f180: 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b        zJournal +
f190: 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e  = (strlen(zJourn
f1a0: 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
f1b0: 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69  }.  .  rc = sqli
f1c0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
f1d0: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a  , zMaster, 0);..
f1e0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
f1f0: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
f200: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
f210: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
f220: 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
f230: 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e   if( master_open
f240: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
f250: 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
f260: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
f270: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
f280: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73  return rc;.}...s
f290: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
f2a0: 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
f2b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a  Pager *pPager);.
f2c0: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
f2d0: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66  the main file of
f2e0: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
f2f0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
f300: 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63  f pages.** indic
f310: 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63  ated. Also trunc
f320: 61 74 65 20 74 68 65 20 63 61 63 68 65 64 20 72  ate the cached r
f330: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
f340: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
f350: 20 4d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   Might might be 
f360: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
f370: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
f380: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e  s smaller than n
f390: 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61  Page..** This ca
f3a0: 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78  n happen, for ex
f3b0: 61 6d 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65  ample, if we are
f3c0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
f3d0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  f a transaction.
f3e0: 2a 2a 20 77 68 69 63 68 20 68 61 73 20 65 78 74  ** which has ext
f3f0: 65 6e 64 65 64 20 74 68 65 20 66 69 6c 65 20 73  ended the file s
f400: 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20  ize and the new 
f410: 70 61 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20  pages are still 
f420: 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63  all held.** in c
f430: 61 63 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e  ache, then an IN
f440: 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 64  SERT or UPDATE d
f450: 6f 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20  oes a statement 
f460: 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a  rollback.  Some.
f470: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
f480: 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
f490: 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
f4a0: 75 73 65 64 20 69 66 20 79 6f 75 20 74 72 79 20  used if you try 
f4b0: 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61  to.** truncate a
f4c0: 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
f4d0: 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
f4e0: 72 20 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e  r than it curren
f4f0: 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65  tly is,.** so de
f500: 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
f510: 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  nd write a singl
f520: 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 74  e zero byte to t
f530: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
f540: 77 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  w.** file instea
f550: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
f560: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
f570: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
f580: 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  nt nPage){.  int
f590: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f5a0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
f5b0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
f5c0: 55 53 49 56 45 20 26 26 20 70 50 61 67 65 72 2d  USIVE && pPager-
f5d0: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
f5e0: 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
f5f0: 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
f600: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f610: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
f620: 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69  ->fd, &currentSi
f630: 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ze);.    newSize
f640: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
f650: 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  ize*(i64)nPage;.
f660: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f670: 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
f680: 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
f690: 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
f6a0: 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
f6b0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
f6c0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
f6d0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
f6e0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
f6f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
f700: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
f710: 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20  pPager->fd, "", 
f720: 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20  1, newSize-1);. 
f730: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f740: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
f750: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
f760: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
f770: 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72  ge;.    pager_tr
f780: 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
f790: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
f7a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f7b0: 53 65 74 20 74 68 65 20 73 65 63 74 6f 72 53 69  Set the sectorSi
f7c0: 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ze for the given
f7d0: 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   pager..**.** Th
f7e0: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
f7f0: 20 61 74 20 6c 65 61 73 74 20 61 73 20 62 69 67   at least as big
f800: 20 61 73 20 74 68 65 20 73 65 63 74 6f 72 20 73   as the sector s
f810: 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20  ize reported.** 
f820: 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
f830: 6f 72 53 69 7a 65 28 29 2e 20 20 54 68 65 20 6d  orSize().  The m
f840: 69 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20 73 69  inimum sector si
f850: 7a 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a 73 74  ze is 512..*/.st
f860: 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
f870: 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
f880: 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
f890: 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
f8a0: 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
f8b0: 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
f8c0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
f8d0: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74  e ){.    /* Sect
f8e0: 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
f8f0: 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
f900: 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
f910: 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
f920: 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
f930: 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
f940: 69 6e 20 77 68 63 69 68 20 63 61 73 65 20 74 68  in whcih case th
f950: 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
f960: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
f970: 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20  l segfault..    
f980: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
f990: 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
f9a0: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
f9b0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d  pPager->fd);.  }
f9c0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
f9d0: 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b  ectorSize<512 ){
f9e0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
f9f0: 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20  torSize = 512;. 
fa00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
fa10: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
fa20: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
fa30: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
fa40: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
fa50: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
fa60: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
fa70: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
fa80: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
fa90: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
faa0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
fab0: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
fac0: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
fad0: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
fae0: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
faf0: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
fb00: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
fb10: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
fb20: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
fb30: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
fb40: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
fb50: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
fb60: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
fb70: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
fb80: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
fb90: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
fba0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
fbb0: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
fbc0: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
fbd0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
fbe0: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
fbf0: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
fc00: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
fc10: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
fc20: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
fc30: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
fc40: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
fc50: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
fc60: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
fc70: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
fc80: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
fc90: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
fca0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
fcb0: 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54   sector size.  T
fcc0: 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  he header.**    
fcd0: 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20     is this many 
fce0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
fcf0: 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62  *  (6)  4 byte b
fd00: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
fd10: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70  r which is the p
fd20: 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37  age case..**  (7
fd30: 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
fd40: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
fd50: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
fd60: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
fd70: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61  rnal.**       na
fd80: 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d  me.  The value m
fd90: 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69  ay be zero (indi
fda0: 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20  cate that there 
fdb0: 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  is no master.** 
fdc0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a        journal.).
fdd0: 2a 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65 73  **  (8)  N bytes
fde0: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
fdf0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68  ournal name.  Th
fe00: 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e  e name will be n
fe10: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  ul-terminated.**
fe20: 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74         and might
fe30: 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e   be shorter than
fe40: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
fe50: 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68  from (5).  If th
fe60: 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20  e first byte.** 
fe70: 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d        of the nam
fe80: 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74  e is \000 then t
fe90: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
fea0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  r journal.  The 
feb0: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
fec0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20  journal name is 
fed0: 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e  stored in UTF-8.
fee0: 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20 6f  .**  (9)  Zero o
fef0: 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
ff00: 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
ff10: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
ff20: 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
ff30: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
ff40: 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
ff50: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
ff60: 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
ff70: 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
ff80: 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
ff90: 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
ffa0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
ffb0: 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
ffc0: 20 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   8 items above..
ffd0: 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
ffe0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
fff0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
10000 68 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 9th item..**.
10010 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
10020 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
10030 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
10040 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
10050 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
10060 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
10070 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
10080 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
10090 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
100a0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
100b0 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
100c0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
100d0 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
100e0 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
100f0 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
10100 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
10110 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
10120 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
10130 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
10140 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
10150 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
10160 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
10170 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
10180 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
10190 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
101a0 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
101b0 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
101c0 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
101d0 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
101e0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
101f0 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
10200 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
10210 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
10220 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
10230 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
10240 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
10250 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
10260 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
10270 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
10280 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
10290 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
102a0 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
102b0 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
102c0 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
102d0 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
102e0 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
102f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
10300 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
10310 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
10320 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
10330 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
10340 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
10350 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
10360 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
10370 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
10380 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
10390 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
103a0 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
103b0 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
103c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
103d0 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
103e0 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
103f0 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
10400 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
10410 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
10420 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
10430 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
10440 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
10450 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
10460 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
10470 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
10480 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
10490 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
104a0 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
104b0 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
104c0 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
104d0 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
104e0 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
104f0 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
10500 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
10510 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
10520 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
10530 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
10540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10550 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
10560 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
10570 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
10580 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
10590 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
105a0 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
105b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
105c0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
105d0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
105e0 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
105f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10600 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
10610 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
10620 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10640 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
10650 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
10660 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
10670 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
10680 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
10690 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106b0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
106c0 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
106d0 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b  /.  int res = 0;
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
106f0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
10700 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
10710 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
10720 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
10730 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
10740 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10750 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a   if any */..  /*
10760 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
10770 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
10780 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
10790 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
107a0 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
107b0 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
107c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
107d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
107e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
107f0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
10800 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20  r->jfd, &szJ);. 
10810 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10820 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a  OK || szJ==0 ){.
10830 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
10840 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
10850 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
10860 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
10870 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
10880 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
10890 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
108a0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
108b0 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
108c0 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
108d0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
108e0 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
108f0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
10900 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
10910 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
10920 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
10930 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  k..  */.  zMaste
10940 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
10950 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65  Space;.  rc = re
10960 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
10970 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
10980 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
10990 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
109a0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
109b0 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74  ITE_OK || (zMast
109c0 65 72 5b 30 5d 20 0a 20 20 20 26 26 20 28 72 65  er[0] .   && (re
109d0 73 3d 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  s=sqlite3OsAcces
109e0 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
109f0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
10a00 58 49 53 54 53 29 29 3d 3d 30 20 29 20 0a 20 20  XISTS))==0 ) .  
10a10 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  ){.    zMaster =
10a20 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   0;.    goto end
10a30 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
10a40 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
10a50 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
10a60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
10a70 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  RR_NOMEM;.    go
10a80 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
10a90 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
10aa0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a  ournalOff = 0;..
10ab0 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
10ac0 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
10ad0 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f   when the readJo
10ae0 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20  urnalHdr() call 
10af0 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c  returns.  ** SQL
10b00 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
10b10 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  O error occurs. 
10b20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
10b30 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
10b40 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
10b50 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
10b60 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
10b70 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
10b80 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
10b90 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
10ba0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
10bb0 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
10bc0 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
10bd0 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
10be0 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
10bf0 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
10c00 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
10c10 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
10c20 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
10c30 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
10c40 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
10c50 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
10c60 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
10c70 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
10c80 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
10c90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
10ca0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
10cb0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
10cc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10cd0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
10ce0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
10cf0 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
10d00 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
10d10 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
10d20 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
10d30 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
10d40 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
10d50 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
10d60 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
10d70 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
10d80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
10d90 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
10da0 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
10db0 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
10dc0 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
10dd0 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
10de0 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
10df0 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
10e00 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
10e10 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
10e20 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
10e30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
10e40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
10e50 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
10e60 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
10e70 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55  Rec = (szJ - JOU
10e80 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10e90 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
10ea0 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
10eb0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
10ec0 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
10ed0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
10ee0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
10ef0 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
10f00 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
10f10 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
10f20 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
10f30 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
10f40 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
10f50 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
10f60 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
10f70 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
10f80 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
10f90 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
10fa0 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
10fb0 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
10fc0 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
10fd0 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
10fe0 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
10ff0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
11000 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
11010 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
11020 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
11030 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
11040 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11050 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f  nRec==0 && !isHo
11060 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61  t &&.        pPa
11070 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
11080 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
11090 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
110a0 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
110b0 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
110c0 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
110d0 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
110e0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
110f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
11100 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
11110 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
11120 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
11130 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
11140 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
11150 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
11160 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
11170 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
11180 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
11190 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
111a0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
111b0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
111c0 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
111d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
111e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
111f0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
11200 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
11210 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
11220 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
11230 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
11240 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
11250 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
11260 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
11270 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
11280 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  c; i++){.      r
11290 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
112a0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
112b0 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
112c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
112d0 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  Off, 1);.      i
112e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
112f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11300 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
11310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
11320 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
11330 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
11340 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
11350 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11360 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11370 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11380 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
11390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
113a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
113b0 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
113c0 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
113d0 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
113e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
113f0 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
11400 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
11410 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
11420 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
11430 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
11440 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
11450 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
11460 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
11470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
11480 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
11490 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
114a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
114b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
114c0 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 2f  ster[0] ){.    /
114d0 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
114e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
114f0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
11500 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
11510 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
11520 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
11530 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
11540 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
11550 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
11560 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
11570 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
11580 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
11590 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
115a0 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
115b0 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
115c0 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
115d0 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
115e0 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
115f0 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
11600 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20  ifferent sector 
11610 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  size.  ** value.
11620 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
11630 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
11640 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
11650 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f  .  */.  setSecto
11660 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
11670 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11680 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
11690 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
116a0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nal..**.** This 
116b0 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c  is similar to pl
116c0 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74  aying back the t
116d0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
116e0 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61  al but with.** a
116f0 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74   few extra twist
11700 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
11710 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   The number of p
11720 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
11730 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
11740 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20   start of.**    
11750 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65       the stateme
11760 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  nt is stored in 
11770 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
11780 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20  , not in the.** 
11790 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
117a0 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a  file itself..**.
117b0 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64  **    (2)  In ad
117c0 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e  dition to playin
117d0 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  g back the state
117e0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c  ment journal, al
117f0 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c  so.**         pl
11800 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73  ayback all pages
11810 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
11820 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69  ion journal begi
11830 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  nning.**        
11840 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65   at offset pPage
11850 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f  r->stmtJSize..*/
11860 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
11870 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
11880 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11890 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
118a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
118b0 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a  ze of the full j
118c0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
118d0 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52  hdrOff;.  int nR
118e0 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
118f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11900 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  Records */.  int
11910 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
11920 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
11930 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
11940 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67  c;..  szJ = pPag
11950 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
11960 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66  .  /* Set hdrOff
11970 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65   to be the offse
11980 74 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65  t just after the
11990 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74   end of the last
119a0 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61   journal.  ** pa
119b0 67 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72  ge written befor
119c0 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
119d0 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74  nal-header for t
119e0 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  his statement.  
119f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
11a00 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74  as written, or t
11a10 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
11a20 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c  le if no journal
11a30 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73  .  ** header was
11a40 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   written..  */. 
11a50 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72   hdrOff = pPager
11a60 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20  ->stmtHdrOff;.  
11a70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11a80 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72  fullSync || !hdr
11a90 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64  Off );.  if( !hd
11aa0 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f  rOff ){.    hdrO
11ab0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20  ff = szJ;.  }.  
11ac0 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74  .  /* Truncate t
11ad0 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b  he database back
11ae0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
11af0 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   size..  */.  rc
11b00 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
11b10 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
11b20 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61  ->stmtSize);.  a
11b30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
11b40 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
11b50 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  ED );..  /* Figu
11b60 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
11b70 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
11b80 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
11b90 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
11ba0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
11bb0 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72  tInUse && pPager
11bc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
11bd0 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72  .  nRec = pPager
11be0 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20  ->stmtNRec;.  . 
11bf0 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
11c00 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
11c10 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
11c20 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
11c30 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
11c40 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65  base file.  Note
11c50 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
11c60 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74  ent journal omit
11c70 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d  s checksums from
11c80 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72  .  ** each recor
11c90 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61  d since power-fa
11ca0 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69  ilure recovery i
11cb0 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20  s not important 
11cc0 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  to statement.  *
11cd0 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  * journals..  */
11ce0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52  .  for(i=0; i<nR
11cf0 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36  ec; i++){.    i6
11d00 34 20 6f 66 66 73 65 74 20 3d 20 69 2a 28 34 2b  4 offset = i*(4+
11d10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
11d20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
11d30 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
11d40 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
11d50 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74  er->stfd, offset
11d60 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
11d70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
11d80 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
11d90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
11da0 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
11db0 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ack;.  }..  /* N
11dc0 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67  ow roll some pag
11dd0 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
11de0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
11df0 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74  rnal. Pager.stmt
11e00 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74  JSize.  ** was t
11e10 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
11e20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
11e30 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
11e40 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a  was started, so.
11e50 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20    ** everything 
11e60 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73  after that needs
11e70 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
11e80 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20  ck, either into 
11e90 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
11ea0 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61  e, the memory ca
11eb0 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20  che, or both..  
11ec0 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73  **.  ** If it is
11ed0 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
11ee0 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66  Pager.stmtHdrOff
11ef0 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74   is the offset t
11f00 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
11f10 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f   of the first jo
11f20 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
11f30 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73  tten during this
11f40 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
11f50 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70  action..  */.  p
11f60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11f70 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
11f80 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  JSize;.  pPager-
11f90 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61  >cksumInit = pPa
11fa0 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a  ger->stmtCksum;.
11fb0 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
11fc0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64  >journalOff < hd
11fd0 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20 3d  rOff ){.    rc =
11fe0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
11ff0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
12000 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
12010 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
12020 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
12030 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
12040 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
12050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
12060 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
12070 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ack;.  }..  whil
12080 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
12090 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20  alOff < szJ ){. 
120a0 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20     u32 nJRec;   
120b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
120c0 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
120d0 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
120e0 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
120f0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
12100 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  ger, szJ, &nJRec
12110 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69  , &dummy);.    i
12120 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12130 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
12140 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
12150 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  E );.      goto 
12160 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
12170 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
12180 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20   nJRec==0 ){.   
12190 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20     nJRec = (szJ 
121a0 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
121b0 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d  lOff) / (pPager-
121c0 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20  >pageSize+8);.  
121d0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a    }.    for(i=nJ
121e0 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70  Rec-1; i>=0 && p
121f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
12200 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20  f < szJ; i--){. 
12210 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
12220 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
12230 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
12240 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
12250 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20  ournalOff, 1);. 
12260 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
12270 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
12280 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12290 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
122a0 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
122b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
122c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
122d0 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f  f = szJ;.  .end_
122e0 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
122f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12300 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72  OK) {.    pPager
12310 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
12320 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72  zJ;.    /* pager
12330 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
12340 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20  ager); */.  }.  
12350 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12360 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
12370 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
12380 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
12390 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
123a0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
123b0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
123c0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
123d0 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
123e0 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20    if( mxPage>10 
123f0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
12400 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a  xPage = mxPage;.
12410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
12420 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
12430 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
12440 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
12450 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
12460 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
12470 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
12480 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
12490 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
124a0 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
124b0 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
124c0 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
124d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
124e0 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
124f0 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
12500 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
12510 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
12520 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
12530 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
12540 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12550 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
12560 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
12570 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
12580 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
12590 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
125a0 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
125b0 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
125d0 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
125e0 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
125f0 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
12600 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
12610 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
12620 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
12630 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
12640 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
12650 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
12660 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
12670 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
12680 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
12690 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
126a0 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
126b0 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
126c0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
126d0 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
126e0 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
126f0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
12700 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
12710 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
12720 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
12730 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
12740 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
12750 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
12760 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
12770 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
12780 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
12790 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
127a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
127b0 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
127c0 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
127d0 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
127e0 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
127f0 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
12800 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
12810 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
12820 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
12830 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
12840 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
12850 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
12860 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
12870 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
12880 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
12890 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
128b0 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
128c0 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
128d0 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
128e0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
128f0 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
12900 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
12910 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
12920 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
12930 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
12940 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12950 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
12960 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
12970 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
12980 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
12990 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
129a0 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70  full_fsync){.  p
129b0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
129c0 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
129d0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
129e0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
129f0 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
12a00 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
12a10 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  e;.  pPager->syn
12a20 63 5f 66 6c 61 67 73 20 3d 20 28 66 75 6c 6c 5f  c_flags = (full_
12a30 66 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  fsync?SQLITE_SYN
12a40 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
12a50 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
12a60 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
12a70 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
12a80 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
12a90 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
12aa0 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
12ab0 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
12ac0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
12ad0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
12ae0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
12af0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
12b00 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
12b10 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
12b20 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
12b30 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
12b40 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
12b50 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
12b60 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
12b70 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
12b80 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
12b90 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ary file. .**.**
12ba0 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
12bb0 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
12bc0 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
12bd0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
12be0 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
12bf0 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
12c00 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53   we fail. The OS
12c10 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
12c20 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74  lly delete the t
12c30 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
12c40 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
12c50 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
12c60 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
12c70 65 6e 74 65 6d 70 28 0a 20 20 73 71 6c 69 74 65  entemp(.  sqlite
12c80 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
12c90 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
12ca0 69 6c 65 20 73 79 73 74 65 6d 20 6c 61 79 65 72  ile system layer
12cb0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
12cc0 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
12cd0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
12ce0 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
12cf0 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
12d00 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  me,      /* Name
12d10 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 20 4d   of the file.  M
12d20 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
12d30 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
12d40 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
12d50 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
12d60 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
12d70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
12d80 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
12d90 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  0 );..#ifdef SQL
12da0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
12db0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
12dc0 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
12dd0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
12de0 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
12df0 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
12e00 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
12e10 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
12e20 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
12e30 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
12e40 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
12e50 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
12e60 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
12e70 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
12e80 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 46 69  OsOpen(pVfs, zFi
12e90 6c 65 6e 61 6d 65 2c 20 70 46 69 6c 65 2c 20 76  lename, pFile, v
12ea0 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
12eb0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
12ec0 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  E_OK || pFile->p
12ed0 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65 74  Methods );.  ret
12ee0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12ef0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
12f00 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74  ge cache and put
12f10 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
12f20 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20  e page cache in 
12f30 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65  *ppPager..** The
12f40 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
12f50 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73  ed need not exis
12f60 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  t.  The file is 
12f70 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c  not locked until
12f80 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61  .** the first ca
12f90 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
12fa0 65 72 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f  erGet() and is o
12fb0 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e  nly held open un
12fc0 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20  til the.** last 
12fd0 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
12fe0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61   using sqlite3Pa
12ff0 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a  gerUnref()..**.*
13000 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
13010 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
13020 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
13030 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
13040 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
13050 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
13060 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68  o be cached.  Th
13070 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
13080 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
13090 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20  tically when it 
130a0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
130b0 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
130c0 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
130d0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
130e0 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
130f0 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  e..** It is neve
13100 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
13110 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  k.  This can be 
13120 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
13130 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  t an.** in-memor
13140 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  y database..*/.i
13150 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
13160 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
13170 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
13180 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
13190 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
131a0 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
131b0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
131c0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  /* Return the Pa
131d0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
131e0 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
131f0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
13200 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
13210 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
13220 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
13230 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
13240 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
13250 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
13260 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
13270 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13290 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c  * flags controll
132a0 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ing this file */
132b0 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
132c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
132d0 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
132e0 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
132f0 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
13300 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50  .  u8 *pPtr;.  P
13310 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
13320 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13330 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
13340 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
13350 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
13360 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
13370 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Only = 0;.  int 
13380 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
13390 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
133a0 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20  _JOURNAL)==0;.  
133b0 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
133c0 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
133d0 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
133e0 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69  .  int journalFi
133f0 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  leSize = sqlite3
13400 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
13410 29 3b 0a 20 20 69 6e 74 20 6e 44 65 66 61 75 6c  );.  int nDefaul
13420 74 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f 44  tPage = SQLITE_D
13430 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
13440 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  ;.  char *zPathn
13450 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68  ame;.  int nPath
13460 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 7a 53  name;.  char *zS
13470 74 6d 74 4a 72 6e 6c 3b 0a 20 20 69 6e 74 20 6e  tmtJrnl;.  int n
13480 53 74 6d 74 4a 72 6e 6c 3b 0a 0a 20 20 2f 2a 20  StmtJrnl;..  /* 
13490 54 68 65 20 64 65 66 61 75 6c 74 20 72 65 74 75  The default retu
134a0 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  rn is a NULL poi
134b0 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67  nter */.  *ppPag
134c0 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  er = 0;..  /* Co
134d0 6d 70 75 74 65 20 74 68 65 20 66 75 6c 6c 20 70  mpute the full p
134e0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 6e 50 61  athname */.  nPa
134f0 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
13500 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a  xPathname+1;.  z
13510 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
13520 65 33 5f 6d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e  e3_malloc(nPathn
13530 61 6d 65 2a 32 29 3b 0a 20 20 69 66 28 20 7a 50  ame*2);.  if( zP
13540 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
13550 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13560 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
13570 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
13580 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69  ilename[0] ){.#i
13590 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
135a0 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
135b0 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
135c0 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
135d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
135e0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61  b = 1;.      zPa
135f0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20  thname[0] = 0;. 
13600 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
13610 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d      {.      rc =
13620 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
13630 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
13640 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
13650 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
13660 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
13670 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13680 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73  GetTempname(pVfs
13690 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
136a0 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69  thname);.  }.  i
136b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
136c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
136d0 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
136e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
136f0 20 20 7d 0a 20 20 6e 50 61 74 68 6e 61 6d 65 20    }.  nPathname 
13700 3d 20 73 74 72 6c 65 6e 28 7a 50 61 74 68 6e 61  = strlen(zPathna
13710 6d 65 29 3b 0a 0a 20 20 2f 2a 20 50 75 74 20 74  me);..  /* Put t
13720 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
13730 72 6e 61 6c 20 69 6e 20 74 65 6d 70 6f 72 61 72  rnal in temporar
13740 79 20 64 69 73 6b 20 73 70 61 63 65 20 73 69 6e  y disk space sin
13750 63 65 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20  ce this is.  ** 
13760 73 6f 6d 65 74 69 6d 65 73 20 52 41 4d 20 64 69  sometimes RAM di
13770 73 6b 20 6f 72 20 6f 74 68 65 72 20 6f 70 74 69  sk or other opti
13780 6d 69 7a 65 64 20 73 74 6f 72 61 67 65 2e 20 20  mized storage.  
13790 55 6e 6c 69 6b 65 6c 79 20 74 68 65 20 6d 61 69  Unlikely the mai
137a0 6e 0a 20 20 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72  n.  ** main jour
137b0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 73 74  nal file, the st
137c0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
137d0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
137e0 20 62 65 20 0a 20 20 2a 2a 20 63 6f 6c 6f 63 61   be .  ** coloca
137f0 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  ted with the dat
13800 61 62 61 73 65 20 6e 6f 72 20 64 6f 65 73 20 69  abase nor does i
13810 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70 65 72  t need to be per
13820 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  sistent..  */.  
13830 7a 53 74 6d 74 4a 72 6e 6c 20 3d 20 26 7a 50 61  zStmtJrnl = &zPa
13840 74 68 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65  thname[nPathname
13850 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  +1];.  rc = sqli
13860 74 65 33 4f 73 47 65 74 54 65 6d 70 6e 61 6d 65  te3OsGetTempname
13870 28 70 56 66 73 2c 20 70 56 66 73 2d 3e 6d 78 50  (pVfs, pVfs->mxP
13880 61 74 68 6e 61 6d 65 2b 31 2c 20 7a 53 74 6d 74  athname+1, zStmt
13890 4a 72 6e 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  Jrnl);.  if( rc!
138a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
138b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
138c0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
138d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
138e0 6e 53 74 6d 74 4a 72 6e 6c 20 3d 20 73 74 72 6c  nStmtJrnl = strl
138f0 65 6e 28 7a 53 74 6d 74 4a 72 6e 6c 29 3b 0a 0a  en(zStmtJrnl);..
13900 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
13910 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61 67  mory for the pag
13920 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
13930 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
13940 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
13950 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72    sizeof(*pPager
13960 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
13970 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
13980 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   */.    journalF
13990 69 6c 65 53 69 7a 65 20 2b 20 20 20 20 20 20 20  ileSize +       
139a0 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
139b0 61 6c 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  al file structur
139c0 65 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e  e */ .    pVfs->
139d0 73 7a 4f 73 46 69 6c 65 20 2a 20 33 20 2b 20 20  szOsFile * 3 +  
139e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
139f0 6e 20 64 62 20 61 6e 64 20 74 77 6f 20 6a 6f 75  n db and two jou
13a00 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
13a10 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b     3*nPathname +
13a20 20 34 30 20 2b 20 20 20 20 20 20 20 20 20 20 2f   40 +          /
13a30 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69  * zFilename, zDi
13a40 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61  rectory, zJourna
13a50 6c 20 2a 2f 0a 20 20 20 20 6e 53 74 6d 74 4a 72  l */.    nStmtJr
13a60 6e 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nl              
13a70 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 4a 72 6e       /* zStmtJrn
13a80 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  l */.  );.  if( 
13a90 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73  !pPager ){.    s
13aa0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
13ab0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
13ac0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
13ad0 0a 20 20 7d 0a 20 20 70 50 74 72 20 3d 20 28 75  .  }.  pPtr = (u
13ae0 38 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a  8 *)&pPager[1];.
13af0 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
13b00 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 20  gs = vfsFlags;. 
13b10 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 28 73   pPager->fd = (s
13b20 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50  qlite3_file*)&pP
13b30 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
13b40 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e*0];.  pPager->
13b50 73 74 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  stfd = (sqlite3_
13b60 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
13b70 2d 3e 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b 0a 20  ->szOsFile*1];. 
13b80 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28   pPager->jfd = (
13b90 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
13ba0 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
13bb0 6c 65 2a 32 5d 3b 0a 20 20 70 50 61 67 65 72 2d  le*2];.  pPager-
13bc0 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
13bd0 61 72 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e  ar*)&pPtr[pVfs->
13be0 73 7a 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75 72 6e  szOsFile*2+journ
13bf0 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  alFileSize];.  p
13c00 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
13c10 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69  y = &pPager->zFi
13c20 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65  lename[nPathname
13c30 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
13c40 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
13c50 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50  r->zDirectory[nP
13c60 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50  athname+1];.  pP
13c70 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 20  ager->zStmtJrnl 
13c80 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  = &pPager->zJour
13c90 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 30  nal[nPathname+10
13ca0 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66  ];.  pPager->pVf
13cb0 73 20 3d 20 70 56 66 73 3b 0a 20 20 6d 65 6d 63  s = pVfs;.  memc
13cc0 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
13cd0 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
13ce0 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20   nPathname+1);. 
13cf0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
13d00 7a 53 74 6d 74 4a 72 6e 6c 2c 20 7a 53 74 6d 74  zStmtJrnl, zStmt
13d10 4a 72 6e 6c 2c 20 6e 53 74 6d 74 4a 72 6e 6c 2b  Jrnl, nStmtJrnl+
13d20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  1);.  sqlite3_fr
13d30 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 0a  ee(zPathname);..
13d40 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
13d50 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
13d60 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
13d70 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26  & zFilename[0] &
13d80 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  & !memDb ){.    
13d90 69 66 28 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70  if( nPathname>(p
13da0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
13db0 2d 20 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e  - sizeof("-journ
13dc0 61 6c 22 29 29 20 29 7b 0a 20 20 20 20 20 20 72  al")) ){.      r
13dd0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
13de0 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  PEN;.    }else{.
13df0 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
13e00 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
13e10 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
13e20 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  s, pPager->zFile
13e30 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64  name, pPager->fd
13e40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13e50 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
13e60 72 2d 3e 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  r->vfsFlags, &fo
13e70 75 74 29 3b 0a 20 20 20 20 20 20 72 65 61 64 4f  ut);.      readO
13e80 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
13e90 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
13ea0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
13eb0 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
13ec0 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
13ed0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
13ee0 61 63 63 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a  access,.      **
13ef0 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
13f00 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
13f10 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
13f20 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 20 20  reate the.      
13f30 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
13f40 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61  . The default pa
13f50 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d  ge size is the m
13f60 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20  aximum of:.     
13f70 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
13f80 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  + SQLITE_DEFAULT
13f90 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20  _PAGE_SIZE,.    
13fa0 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61    **    + The va
13fb0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
13fc0 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
13fd0 69 7a 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 20  ize().      **  
13fe0 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
13ff0 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
14000 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
14010 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20  omically..      
14020 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  */.      if( rc=
14030 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72  =SQLITE_OK && !r
14040 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
14050 20 20 20 69 6e 74 20 69 53 65 63 74 6f 72 53 69     int iSectorSi
14060 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
14070 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
14080 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >fd);.        if
14090 28 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3c 69  ( nDefaultPage<i
140a0 53 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  SectorSize ){.  
140b0 20 20 20 20 20 20 20 20 6e 44 65 66 61 75 6c 74          nDefault
140c0 50 61 67 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Page = iSectorSi
140d0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69  ze;.        }.#i
140e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
140f0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
14100 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
14110 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
14120 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
14130 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
14140 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
14150 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
14160 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
14170 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
14180 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
14190 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
141a0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
141b0 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
141c0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
141d0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
141e0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
141f0 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
14200 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 6e 44         for(ii=nD
14210 65 66 61 75 6c 74 50 61 67 65 3b 20 69 69 3c 3d  efaultPage; ii<=
14220 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
14230 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
14240 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
14250 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
14260 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
14270 7c 28 69 69 3e 3e 38 29 29 20 29 20 6e 44 65 66  |(ii>>8)) ) nDef
14280 61 75 6c 74 50 61 67 65 20 3d 20 69 69 3b 0a 20  aultPage = ii;. 
14290 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
142a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
142b0 20 20 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74      if( nDefault
142c0 50 61 67 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Page>SQLITE_MAX_
142d0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
142e0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  E ){.          n
142f0 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20 53 51  DefaultPage = SQ
14300 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
14310 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
14320 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14330 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
14340 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 2f 2a  !memDb ){.    /*
14350 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
14360 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
14370 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
14380 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
14390 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
143a0 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
143b0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
143c0 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
143d0 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
143e0 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
143f0 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
14400 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
14410 29 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74  )..    */ .    t
14420 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
14430 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
14440 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
14450 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
14460 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ger && rc==SQLIT
14470 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
14480 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
14490 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
144a0 6f 28 6e 44 65 66 61 75 6c 74 50 61 67 65 29 3b  o(nDefaultPage);
144b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
144c0 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69   error occured i
144d0 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
144e0 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20  blocks above..  
144f0 2a 2a 20 46 72 65 65 20 74 68 65 20 50 61 67 65  ** Free the Page
14500 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
14510 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
14520 20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 70    ** Since the p
14530 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  ager is not allo
14540 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e  cated there is n
14550 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20  o need to set . 
14560 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72   ** any Pager.er
14570 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e  rMask variables.
14580 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
14590 67 65 72 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  ger || !pPager->
145a0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
145b0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
145c0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
145d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
145e0 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
145f0 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  n ((rc==SQLITE_O
14600 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  K)?SQLITE_NOMEM:
14610 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  rc);.  }..  PAGE
14620 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64  RTRACE3("OPEN %d
14630 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
14640 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
14650 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
14660 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ame);.  IOTRACE(
14670 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
14680 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
14690 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
146a0 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72  /* Fill in Pager
146b0 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f  .zDirectory[] */
146c0 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
146d0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 70 50  ->zDirectory, pP
146e0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
146f0 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20   nPathname+1);. 
14700 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 70 50   for(i=strlen(pP
14710 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
14720 29 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72  ); i>0 && pPager
14730 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
14740 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='/'; i--){}. 
14750 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65   if( i>0 ) pPage
14760 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
14770 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69  1] = 0;..  /* Fi
14780 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75  ll in Pager.zJou
14790 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63  rnal[] */.  memc
147a0 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
147b0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  nal, pPager->zFi
147c0 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
147d0 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50  e);.  memcpy(&pP
147e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
147f0 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
14800 72 6e 61 6c 22 2c 20 39 29 3b 0a 0a 20 20 2f 2a  rnal", 9);..  /*
14810 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14820 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Open = 0; */.  p
14830 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
14840 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26  l = useJournal &
14850 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  & !memDb;.  pPag
14860 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
14870 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72   noReadlock && r
14880 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
14890 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
148a0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
148b0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
148c0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
148d0 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
148e0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
148f0 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50   = memDb-1;.  pP
14900 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
14910 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3b 0a 20   nDefaultPage;. 
14920 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
14930 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
14940 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
14950 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
14960 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
14970 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
14980 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20  >mxPage = 100;. 
14990 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
149a0 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
149b0 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
149c0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
149d0 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20  GER_UNLOCK; */. 
149e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
149f0 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46  >state == (tempF
14a00 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c  ile ? PAGER_EXCL
14a10 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e  USIVE : PAGER_UN
14a20 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50  LOCK) );.  /* pP
14a30 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
14a40 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
14a50 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46  tempFile = tempF
14a60 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
14a70 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
14a80 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
14a90 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
14aa0 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
14ab0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
14ac0 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
14ad0 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
14ae0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
14af0 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
14b00 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 74  xclusiveMode = t
14b10 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
14b20 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
14b30 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
14b40 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
14b50 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  ;.  /* pPager->n
14b60 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a  eedSync = 0; */.
14b70 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
14b80 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
14b90 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e  ile || !useJourn
14ba0 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  al;.  pPager->fu
14bb0 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72  llSync = (pPager
14bc0 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20  ->noSync?0:1);. 
14bd0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
14be0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
14bf0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70  C_NORMAL;.  /* p
14c00 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
14c10 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
14c20 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
14c30 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
14c40 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
14c50 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
14c60 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47  tra = FORCE_ALIG
14c70 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20  NMENT(nExtra);. 
14c80 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
14c90 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 6d 65  fd->pMethods||me
14ca0 6d 44 62 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a  mDb||tempFile);.
14cb0 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a    if( !memDb ){.
14cc0 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a      setSectorSiz
14cd0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
14ce0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
14cf0 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
14d00 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
14d10 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
14d20 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
14d30 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50  ash)); */.  *ppP
14d40 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23  ager = pPager;.#
14d50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
14d60 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
14d70 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e  EMENT.  pPager->
14d80 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20  iInUseMM = 0;.  
14d90 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42  pPager->iInUseDB
14da0 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6d 65 6d   = 0;.  if( !mem
14db0 44 62 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  Db ){.#ifndef SQ
14dc0 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a  LITE_MUTEX_NOOP.
14dd0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14de0 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  x *mutex = sqlit
14df0 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
14e00 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
14e10 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64 69 66  IC_MEM2);.#endif
14e20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
14e30 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b  ex_enter(mutex);
14e40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4e 65  .    pPager->pNe
14e50 78 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  xt = sqlite3Page
14e60 72 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 73  rList;.    if( s
14e70 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20  qlite3PagerList 
14e80 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14e90 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
14ea0 74 2d 3e 70 50 72 65 76 3d 3d 30 20 29 3b 0a 20  t->pPrev==0 );. 
14eb0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14ec0 72 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70  rList->pPrev = p
14ed0 50 61 67 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Pager;.    }.   
14ee0 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 20 3d   pPager->pPrev =
14ef0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   0;.    sqlite3P
14f00 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61 67 65  agerList = pPage
14f10 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  r;.    sqlite3_m
14f20 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
14f30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
14f40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14f50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
14f60 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
14f70 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
14f80 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
14f90 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67  tBusyhandler(Pag
14fa0 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79  er *pPager, Busy
14fb0 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
14fc0 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72  ndler){.  pPager
14fd0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
14fe0 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d   pBusyHandler;.}
14ff0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
15000 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
15010 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
15020 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
15030 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
15040 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
15050 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
15060 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
15070 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
15080 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
15090 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
150a0 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
150b0 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
150c0 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
150d0 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
150e0 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
150f0 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
15100 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
15110 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 20  e3PagerClose(). 
15120 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73   .** Destructors
15130 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64   are only called
15140 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
15150 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Unref()..*/.void
15160 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15170 44 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72  Destructor(Pager
15180 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
15190 2a 78 44 65 73 63 29 28 44 62 50 61 67 65 2a 2c  *xDesc)(DbPage*,
151a0 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
151b0 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
151c0 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
151d0 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
151e0 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
151f0 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
15200 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
15210 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
15220 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
15230 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
15240 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
15250 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
15260 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
15270 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
15280 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
15290 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
152a0 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
152b0 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
152c0 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
152d0 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
152e0 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
152f0 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
15300 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
15310 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69  te3PagerSetReini
15320 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
15330 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  r, void (*xReini
15340 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29  t)(DbPage*,int))
15350 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
15360 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
15370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
15380 65 20 70 61 67 65 20 73 69 7a 65 20 74 6f 20 2a  e page size to *
15390 70 50 61 67 65 53 69 7a 65 2e 20 49 66 20 74 68  pPageSize. If th
153a0 65 20 73 75 67 67 65 73 74 20 6e 65 77 20 70 61  e suggest new pa
153b0 67 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 69 6e  ge size is.** in
153c0 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65  appropriate, the
153d0 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  n an alternative
153e0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
153f0 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c  t to that.** val
15400 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ue before return
15410 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
15420 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
15430 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
15440 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a  r, u16 *pPageSiz
15450 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
15460 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 31 36 20  QLITE_OK;.  u16 
15470 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
15480 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
15490 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
154a0 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
154b0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
154c0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
154d0 29 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  ) );.  if( pageS
154e0 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
154f0 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  =pPager->pageSiz
15500 65 20 0a 20 20 20 26 26 20 21 70 50 61 67 65 72  e .   && !pPager
15510 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65  ->memDb && pPage
15520 72 2d 3e 6e 52 65 66 3d 3d 30 20 0a 20 20 29 7b  r->nRef==0 .  ){
15530 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20  .    char *pNew 
15540 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
15550 33 5f 6d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  3_malloc(pageSiz
15560 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4e 65  e);.    if( !pNe
15570 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
15580 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
15590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
155a0 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
155b0 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  );.      pager_r
155c0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
155d0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
155e0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
155f0 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72  .      setSector
15600 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
15610 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15620 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
15630 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ce);.      pPage
15640 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
15650 4e 65 77 3b 0a 20 20 20 20 20 20 70 61 67 65 72  New;.      pager
15660 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
15670 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 61 67     }.  }.  *pPag
15680 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
15690 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 65 74 75  pageSize;.  retu
156a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
156b0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
156c0 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
156d0 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
156e0 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
156f0 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
15700 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
15710 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
15720 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
15730 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
15740 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
15750 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
15760 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
15770 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
15780 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
15790 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
157a0 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
157b0 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
157c0 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
157d0 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
157e0 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
157f0 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
15800 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
15810 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
15820 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
15830 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
15840 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
15850 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
15860 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
15870 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
15880 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
15890 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
158a0 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
158b0 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
158c0 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
158d0 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
158e0 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
158f0 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
15900 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
15910 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
15920 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
15930 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
15940 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
15950 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
15960 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
15970 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
15980 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
15990 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
159a0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
159b0 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
159c0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
159d0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
159e0 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Page;.  }.  sqli
159f0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
15a00 74 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  t(pPager);.  ret
15a10 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
15a20 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
15a30 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
15a40 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
15a50 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
15a60 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
15a70 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
15a80 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
15a90 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
15aa0 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
15ab0 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
15ac0 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
15ad0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
15ae0 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
15af0 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
15b00 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
15b10 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
15b20 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
15b30 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
15b40 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
15b50 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
15b60 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
15b70 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
15b80 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
15b90 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
15ba0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
15bb0 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
15bc0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
15bd0 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
15be0 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
15bf0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
15c00 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
15c10 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
15c20 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
15c30 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
15c40 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
15c50 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
15c60 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
15c70 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
15c80 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
15c90 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
15ca0 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
15cb0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
15cc0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
15cd0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
15ce0 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
15cf0 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
15d00 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
15d10 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
15d20 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
15d30 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ts to. .**.** No
15d40 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
15d50 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74  is done. The rat
15d60 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69  ional for this i
15d70 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
15d80 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20  tion .** may be 
15d90 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74  called even if t
15da0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
15db0 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
15dc0 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a  n a header. In .
15dd0 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20 73  ** these cases s
15de0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 77  qlite3OsRead() w
15df0 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ill return an er
15e00 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68  ror, to which th
15e10 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65  e correct .** re
15e20 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72  sponse is to zer
15e30 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20  o the memory at 
15e40 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e  pDest and contin
15e50 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65  ue.  A real IO e
15e60 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72  rror .** will pr
15e70 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61  esumably recur a
15e80 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70 20  nd be picked up 
15e90 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69  later (Todo: Thi
15ea0 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a  nk about this)..
15eb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
15ec0 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
15ed0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
15ee0 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
15ef0 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
15f00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15f10 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
15f20 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
15f30 73 65 72 74 28 4d 45 4d 44 42 7c 7c 70 50 61 67  sert(MEMDB||pPag
15f40 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
15f50 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ||pPager->tempFi
15f60 6c 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  le);.  if( pPage
15f70 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
15f80 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
15f90 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
15fa0 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
15fb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15fc0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
15fd0 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
15fe0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15ff0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
16000 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
16010 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
16020 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
16030 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
16040 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
16050 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
16060 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
16070 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
16080 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a  * pPager. .**.**
16090 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   If the PENDING_
160a0 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65  BYTE lies on the
160b0 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61   page directly a
160c0 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
160d0 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  the.** file, the
160e0 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  n consider this 
160f0 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65  page part of the
16100 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65   file too. For e
16110 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45  xample, if.** PE
16120 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79  NDING_BYTE is by
16130 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72  te 4096 (the fir
16140 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20  st byte of page 
16150 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  5) and the size 
16160 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  of the.** file i
16170 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20  s 4096 bytes, 5 
16180 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
16190 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74  ead of 4..*/.int
161a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
161b0 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
161c0 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 20 3d  ager){.  i64 n =
161d0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
161e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
161f0 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
16200 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
16210 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
16220 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
16230 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
16240 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  n = pPager->dbSi
16250 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ze;.  } else {. 
16260 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
16270 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
16280 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
16290 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 67  );.    if( (pPag
162a0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
162b0 29 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d 20  ).     && (rc = 
162c0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
162d0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
162e0 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
162f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
16300 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 70 61 67  Ref++;.      pag
16310 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
16320 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67   rc);.      pPag
16330 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  er->nRef--;.    
16340 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
16350 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
16360 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65  & n<pPager->page
16370 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20  Size ){.      n 
16380 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
16390 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65        n /= pPage
163a0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
163b0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
163c0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
163d0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
163e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
163f0 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   n;.    }.  }.  
16400 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f  if( n==(PENDING_
16410 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
16420 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b  eSize) ){.    n+
16430 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70  +;.  }.  if( n>p
16440 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
16450 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
16460 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72  gno = n;.  }.  r
16470 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66  eturn n;.}...#if
16480 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16490 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20  _MEMORYDB./*.** 
164a0 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72  Clear a PgHistor
164b0 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  y block.*/.stati
164c0 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74  c void clearHist
164d0 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70  ory(PgHistory *p
164e0 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  Hist){.  sqlite3
164f0 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72  _free(pHist->pOr
16500 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ig);.  sqlite3_f
16510 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
16520 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
16530 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
16540 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c  pStmt = 0;.}.#el
16550 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72  se.#define clear
16560 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69  History(x).#endi
16570 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  f../*.** Forward
16580 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
16590 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
165a0 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
165b0 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
165c0 67 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  g from its hash 
165d0 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20  chain. Also set 
165e0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
165f0 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65  to 0 to indicate
16600 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
16610 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  e is not part of
16620 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e   any hash chain.
16630 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
16640 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  d because the.**
16650 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
16660 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20  epage() routine 
16670 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65  can leave a page
16680 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78   in the .** pNex
16690 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20  tFree/pPrevFree 
166a0 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74  list that is not
166b0 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68   a part of any h
166c0 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74  ash-chain..*/.st
166d0 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b  atic void unlink
166e0 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20  HashChain(Pager 
166f0 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
16700 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
16710 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  >pgno==0 ){.    
16720 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
16730 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67  xtHash==0 && pPg
16740 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
16750 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
16760 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
16770 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50  xtHash ){.    pP
16780 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
16790 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  revHash = pPg->p
167a0 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20  PrevHash;.  }.  
167b0 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61  if( pPg->pPrevHa
167c0 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  sh ){.    assert
167d0 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
167e0 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61  pPg->pgno & (pPa
167f0 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d  ger->nHash-1)]!=
16800 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
16810 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74  pPrevHash->pNext
16820 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Hash = pPg->pNex
16830 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tHash;.  }else{.
16840 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d      int h = pPg-
16850 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  >pgno & (pPager-
16860 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70  >nHash-1);.    p
16870 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
16880 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
16890 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
168a0 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69  B ){.    clearHi
168b0 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48  story(PGHDR_TO_H
168c0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
168d0 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67  );.  }.  pPg->pg
168e0 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70  no = 0;.  pPg->p
168f0 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
16900 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d  pPrevHash = 0;.}
16910 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61  ../*.** Unlink a
16920 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
16930 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69  ree list (the li
16940 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
16950 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a  where nRef==0).*
16960 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68  * and from its h
16970 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68  ash collision ch
16980 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
16990 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50  oid unlinkPage(P
169a0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
169b0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
169c0 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
169d0 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66 72 65   Unlink from fre
169e0 65 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20  e page list */. 
169f0 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70   lruListRemove(p
16a00 50 67 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  Pg);..  /* Unlin
16a10 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20  k from the pgno 
16a20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
16a30 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
16a40 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a  pPager, pPg);.}.
16a50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
16a60 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74  ine is used to t
16a70 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68  runcate the cach
16a80 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  e when a databas
16a90 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65  e.** is truncate
16aa0 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68  d.  Drop from th
16ab0 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65  e cache all page
16ac0 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a  s whose pgno is.
16ad0 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  ** larger than p
16ae0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e  Pager->dbSize an
16af0 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65  d is unreference
16b00 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  d..**.** Referen
16b10 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72  ced pages larger
16b20 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
16b30 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  Size are zeroed.
16b40 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  .**.** Actually,
16b50 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68   at the point th
16b60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
16b70 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62  lled, it would b
16b80 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  e.** an error to
16b90 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63   have a referenc
16ba0 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72 61  ed page.  But ra
16bb0 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65  ther than delete
16bc0 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e  .** that page an
16bd0 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 75  d guarantee a su
16be0 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c  bsequent segfaul
16bf0 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74 74  t, it seems bett
16c00 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74  er.** to zero it
16c10 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77   and hope that w
16c20 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65  e error out sane
16c30 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
16c40 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
16c50 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
16c60 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
16c70 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a  *pPg;.  PgHdr **
16c80 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69  ppPg;.  int dbSi
16c90 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
16ca0 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26  ize;..  ppPg = &
16cb0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
16cc0 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70  while( (pPg = *p
16cd0 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  pPg)!=0 ){.    i
16ce0 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62  f( pPg->pgno<=db
16cf0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70  Size ){.      pp
16d00 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
16d10 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  All;.    }else i
16d20 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  f( pPg->nRef>0 )
16d30 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
16d40 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
16d50 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
16d60 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
16d70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
16d80 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tAll;.    }else{
16d90 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70  .      *ppPg = p
16da0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
16db0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
16dc0 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70  FREE %p %d\n", p
16dd0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
16de0 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
16df0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
16e00 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
16e10 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61  ;.      unlinkPa
16e20 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d  ge(pPg);.      m
16e30 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
16e40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
16e50 65 28 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  e(pPg->pData);. 
16e60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
16e70 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50  e(pPg);.      pP
16e80 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20  ager->nPage--;. 
16e90 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
16ea0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
16eb0 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65  a lock on a file
16ec0 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  .  Invoke the bu
16ed0 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
16ee0 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75  he lock.** is cu
16ef0 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
16f00 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75  lable.  Repeat u
16f10 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
16f20 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a  llback returns.*
16f30 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  * false or until
16f40 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
16f50 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
16f60 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
16f70 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
16f80 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
16f90 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
16fa0 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  he lock..*/.stat
16fb0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
16fc0 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
16fd0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
16fe0 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
16ff0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  ;..  /* The OS l
17000 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
17010 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
17020 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
17030 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
17040 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
17050 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
17060 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
17070 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
17080 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
17090 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
170a0 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
170b0 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
170c0 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
170d0 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
170e0 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
170f0 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a  t be unknown */.
17100 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17110 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
17120 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  HARED || pPager-
17130 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d  >dbSize<0 || MEM
17140 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  DB );..  if( pPa
17150 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
17160 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
17170 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
17180 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61  lse{.    if( pPa
17190 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
171a0 72 20 29 20 70 50 61 67 65 72 2d 3e 70 42 75 73  r ) pPager->pBus
171b0 79 48 61 6e 64 6c 65 72 2d 3e 6e 42 75 73 79 20  yHandler->nBusy 
171c0 3d 20 30 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  = 0;.    do {.  
171d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
171e0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
171f0 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  d, locktype);.  
17200 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
17210 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c  LITE_BUSY && sql
17220 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
17230 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
17240 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20  usyHandler) );. 
17250 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17260 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
17270 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f  ager->state = lo
17280 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
17290 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
172a0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
172b0 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
172c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
172d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
172e0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
172f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
17300 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
17310 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
17320 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  rTruncate(Pager 
17330 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
17340 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
17350 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17360 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
17370 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29  HARED || MEMDB )
17380 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
17390 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
173a0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
173b0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
173c0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
173d0 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Code;.    return
173e0 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
173f0 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
17400 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
17410 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17420 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
17430 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
17440 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
17450 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72  nPage;.    pager
17460 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
17470 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
17480 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17490 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28   }.  pagerEnter(
174a0 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
174b0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
174c0 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  er);.  pagerLeav
174d0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
174e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
174f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
17500 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
17510 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
17520 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
17530 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
17540 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45 6e  ng. */.  pagerEn
17550 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
17560 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
17570 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
17580 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
17590 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
175a0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
175b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
175c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
175d0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
175e0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
175f0 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
17600 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
17610 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
17620 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
17630 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
17640 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
17650 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
17660 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
17670 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
17680 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
17690 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
176a0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
176b0 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
176c0 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
176d0 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
176e0 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
176f0 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
17700 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
17710 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
17720 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
17730 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
17740 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
17750 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
17760 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
17770 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
17780 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
17790 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
177a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
177b0 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
177c0 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
177d0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
177e0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
177f0 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
17800 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
17810 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
17820 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
17830 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
17840 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
17850 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
17860 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
17870 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
17880 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66  *pPager){.#ifdef
17890 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
178a0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
178b0 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b  .  if( !MEMDB ){
178c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
178d0 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 20 20 73  MUTEX_NOOP.    s
178e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
178f0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
17900 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
17910 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
17920 4d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  M2);.#endif.    
17930 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
17940 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20  ter(mutex);.    
17950 69 66 28 20 70 50 61 67 65 72 2d 3e 70 50 72 65  if( pPager->pPre
17960 76 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  v ){.      pPage
17970 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
17980 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
17990 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
179a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69    sqlite3PagerLi
179b0 73 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65  st = pPager->pNe
179c0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
179d0 28 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20  ( pPager->pNext 
179e0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
179f0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
17a00 70 50 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20  pPager->pPrev;. 
17a10 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
17a20 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
17a30 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ex);.  }.#endif.
17a40 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
17a50 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
17a60 3b 0a 20 20 73 71 6c 69 74 65 33 46 61 75 6c 74  ;.  sqlite3Fault
17a70 42 65 6e 69 67 6e 28 2d 31 2c 20 31 29 3b 0a 20  Benign(-1, 1);. 
17a80 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17a90 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
17aa0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
17ab0 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
17ac0 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
17ad0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
17ae0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e  ck(pPager);.  en
17af0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
17b00 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
17b10 6c 69 74 65 33 46 61 75 6c 74 42 65 6e 69 67 6e  lite3FaultBenign
17b20 28 2d 31 2c 20 30 29 3b 0a 20 20 50 41 47 45 52  (-1, 0);.  PAGER
17b30 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64  TRACE2("CLOSE %d
17b40 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
17b50 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ger));.  IOTRACE
17b60 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
17b70 70 50 61 67 65 72 29 29 0a 20 20 69 66 28 20 70  pPager)).  if( p
17b80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
17b90 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
17ba0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
17bb0 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >jfd);.  }.  sql
17bc0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
17bd0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
17be0 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61  rnal);.  if( pPa
17bf0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
17c00 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
17c10 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ose(pPager->stfd
17c20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
17c30 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
17c40 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66  fd);.  /* Temp f
17c50 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74  iles are automat
17c60 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62  ically deleted b
17c70 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66  y the OS.  ** if
17c80 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
17c90 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c  le ){.  **   sql
17ca0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
17cb0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ger->zFilename);
17cc0 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20  .  ** }.  */..  
17cd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
17ce0 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73  ger->aHash);.  s
17cf0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
17d00 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
17d10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17d20 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
17d30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
17d40 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
17d50 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
17d60 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
17d70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
17d80 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
17d90 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61   given page data
17da0 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
17db0 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
17dc0 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72  (DbPage *p){.  r
17dd0 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d  eturn p->pgno;.}
17de0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
17df0 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66 75  he page_ref() fu
17e00 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74  nction increment
17e10 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
17e20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
17e30 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  ..** If the page
17e40 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
17e50 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74   the freelist (t
17e60 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
17e70 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e  nt is zero) then
17e80 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72  .** remove it fr
17e90 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  om the freelist.
17ea0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74  .**.** For non-t
17eb0 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67  est systems, pag
17ec0 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61 63  e_ref() is a mac
17ed0 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70  ro that calls _p
17ee0 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c  age_ref().** onl
17ef0 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65 72  ine of the refer
17f00 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
17f10 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79  ro.  For test sy
17f20 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
17f30 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66  ).** is a real f
17f40 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  unction so that 
17f50 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b  we can set break
17f60 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65  points and trace
17f70 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
17f80 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67  oid _page_ref(Pg
17f90 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
17fa0 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
17fb0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
17fc0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e   is currently on
17fd0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
17fe0 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  Remove it. */.  
17ff0 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28    lruListRemove(
18000 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  pPg);.    pPg->p
18010 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
18020 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b   }.  pPg->nRef++
18030 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;.}.#ifdef SQLIT
18040 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63  E_DEBUG.  static
18050 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50   void page_ref(P
18060 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20  gHdr *pPg){.    
18070 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
18080 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f   ){.      _page_
18090 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  ref(pPg);.    }e
180a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
180b0 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRef++;.    }.  
180c0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
180d0 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28   page_ref(P)   (
180e0 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61  (P)->nRef==0?_pa
180f0 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29  ge_ref(P):(void)
18100 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e  (P)->nRef++).#en
18110 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
18120 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
18130 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
18140 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20  age.  The input 
18150 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20  pointer is.** a 
18160 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
18170 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69   page data..*/.i
18180 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
18190 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
181a0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
181b0 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 61  g->pPager);.  pa
181c0 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 70  ge_ref(pPg);.  p
181d0 61 67 65 72 4c 65 61 76 65 28 70 50 67 2d 3e 70  agerLeave(pPg->p
181e0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
181f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18200 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
18210 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72  urnal.  In other
18220 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
18230 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
18240 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
18250 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
18260 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
18270 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
18280 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
18290 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69  e.** disk.  It i
182a0 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f  s not safe to mo
182b0 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61  dify the origina
182c0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
182d0 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74  until after.** t
182e0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
182f0 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20  een synced.  If 
18300 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
18310 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65  abase is modifie
18320 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
18330 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
18340 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61  d and a power fa
18350 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68  ilure occurs, th
18360 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e  e unsynced journ
18370 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64  al.** data would
18380 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20   be lost and we 
18390 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20  would be unable 
183a0 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f  to completely ro
183b0 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61  llback the.** da
183c0 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
183d0 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
183e0 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72  tion would occur
183f0 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
18400 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74  utine also updat
18410 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  es the nRec fiel
18420 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  d in the header 
18430 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  of the journal..
18440 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ** (See comments
18450 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c   on the pager_pl
18460 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
18470 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
18480 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a  information.).**
18490 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64   If the sync mod
184a0 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73  e is FULL, two s
184b0 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e  yncs will occur.
184c0 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c    First the whol
184d0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20  e journal.** is 
184e0 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65  synced, then the
184f0 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75   nRec field is u
18500 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73  pdated, then a s
18510 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72  econd sync occur
18520 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
18530 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
18540 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  , we do not care
18550 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20   if we are able 
18560 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61  to rollback.** a
18570 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69  fter a power fai
18580 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79 6e 63  lure, so no sync
18590 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   occurs..**.** I
185a0 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
185b0 45 4e 54 49 41 4c 20 66 6c 61 67 20 69 73 20 73  ENTIAL flag is s
185c0 65 74 20 66 6f 72 20 74 68 65 20 70 65 72 73 69  et for the persi
185d0 73 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e 20 77  stent media on w
185e0 68 69 63 68 0a 2a 2a 20 74 68 65 20 64 61 74 61  hich.** the data
185f0 62 61 73 65 20 69 73 20 73 74 6f 72 65 64 2c 20  base is stored, 
18600 74 68 65 6e 20 4f 73 53 79 6e 63 28 29 20 69 73  then OsSync() is
18610 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e   never called on
18620 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
18630 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61  file. In this ca
18640 73 65 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  se all that is r
18650 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 75 70  equired is to up
18660 64 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69  date the nRec fi
18670 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f  eld in.** the jo
18680 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 2a 2a  urnal header..**
18690 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
186a0 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64   clears the need
186b0 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76  Sync field of ev
186c0 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74  ery page current
186d0 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f   held in.** memo
186e0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
186f0 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
18700 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
18710 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
18720 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18730 3b 0a 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  ;...  /* Sync th
18740 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
18750 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
18760 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
18770 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
18780 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
18790 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
187a0 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
187b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
187c0 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66  edSync ){.    if
187d0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
187e0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ile ){.      int
187f0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
18800 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
18810 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
18820 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18830 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18840 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20 20 69  Open );..      i
18850 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
18860 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
18870 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
18880 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
18890 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
188a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
188b0 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
188c0 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
188d0 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
188e0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
188f0 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
18900 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
18910 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
18920 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
18930 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
18940 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
18950 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
18960 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
18970 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
18980 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
18990 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
189a0 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
189b0 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
189c0 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
189d0 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
189e0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
189f0 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
18a00 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
18a10 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
18a20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
18a30 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
18a40 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
18a50 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
18a60 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
18a70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
18a80 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
18a90 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
18aa0 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
18ab0 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
18ac0 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
18ad0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
18ae0 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f         i64 jrnlO
18af0 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ff;.        if( 
18b00 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
18b10 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
18b20 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
18b30 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
18b40 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
18b50 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
18b60 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
18b70 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
18b80 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
18b90 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
18ba0 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
18bb0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
18bc0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
18bd0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
18be0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
18bf0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
18c00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
18c10 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70       jrnlOff = p
18c20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
18c30 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
18c40 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
18c50 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
18c60 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
18c70 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66   pPager, jrnlOff
18c80 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72  , 4));.        r
18c90 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
18ca0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
18cb0 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52  lOff, pPager->nR
18cc0 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
18cd0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
18ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18cf0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
18d00 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
18d10 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
18d20 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
18d30 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
18d40 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
18d50 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  r));.        IOT
18d60 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
18d70 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
18d80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18d90 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
18da0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
18db0 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
18dc0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
18dd0 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
18de0 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
18df0 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
18e00 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
18e10 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
18e20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18e30 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
18e40 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
18e50 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
18e60 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
18e70 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
18e80 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
18e90 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
18ea0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
18eb0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
18ec0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
18ed0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
18ee0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
18ef0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
18f00 20 20 20 20 6c 72 75 4c 69 73 74 53 65 74 46 69      lruListSetFi
18f10 72 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72  rstSynced(pPager
18f20 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
18f30 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
18f40 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
18f50 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  c flag is clear 
18f60 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e  then the PgHdr.n
18f70 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  eedSync.  ** fla
18f80 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63  g must also be c
18f90 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67  lear for all pag
18fa0 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  es.  Verify that
18fb0 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72   this.  ** invar
18fc0 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20  iant is true..  
18fd0 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66  */.  else{.    f
18fe0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
18ff0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
19000 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
19010 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
19020 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
19030 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19040 28 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  ( pPager->lru.pF
19050 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67  irstSynced==pPag
19060 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 20 29  er->lru.pFirst )
19070 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
19080 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19090 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69  .** Merge two li
190a0 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e  sts of pages con
190b0 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
190c0 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64   and in pgno ord
190d0 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f  er..** Do not bo
190e0 74 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50  th fixing the pP
190f0 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72  revDirty pointer
19100 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  s..*/.static PgH
19110 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69  dr *merge_pageli
19120 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67  st(PgHdr *pA, Pg
19130 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64  Hdr *pB){.  PgHd
19140 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c  r result, *pTail
19150 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73  ;.  pTail = &res
19160 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41  ult;.  while( pA
19170 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66   && pB ){.    if
19180 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70  ( pA->pgno<pB->p
19190 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61  gno ){.      pTa
191a0 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b  il->pDirty = pA;
191b0 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70  .      pTail = p
191c0 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41  A;.      pA = pA
191d0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65  ->pDirty;.    }e
191e0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c  lse{.      pTail
191f0 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
19200 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b       pTail = pB;
19210 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e  .      pB = pB->
19220 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
19230 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20  }.  if( pA ){.  
19240 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
19250 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = pA;.  }else if
19260 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69  ( pB ){.    pTai
19270 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a  l->pDirty = pB;.
19280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
19290 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  il->pDirty = 0;.
192a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
192b0 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f  ult.pDirty;.}../
192c0 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69  *.** Sort the li
192d0 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  st of pages in a
192e0 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  ccending order b
192f0 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61  y pgno.  Pages a
19300 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  re.** connected 
19310 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65  by pDirty pointe
19320 72 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69  rs.  The pPrevDi
19330 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65  rty pointers are
19340 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79  .** corrupted by
19350 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23   this sort..*/.#
19360 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
19370 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64  CKET_ALLOC 25.#d
19380 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
19390 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23 69 66  KET       25.#if
193a0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
193b0 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61    int sqlite3_pa
193c0 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
193d0 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20  t = 0;.  #undef 
193e0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20  N_SORT_BUCKET.  
193f0 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
19400 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69  UCKET \.   (sqli
19410 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74  te3_pager_n_sort
19420 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f  _bucket?sqlite3_
19430 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
19440 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ket:N_SORT_BUCKE
19450 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a  T_ALLOC).#endif.
19460 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f  static PgHdr *so
19470 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  rt_pagelist(PgHd
19480 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72  r *pIn){.  PgHdr
19490 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45   *a[N_SORT_BUCKE
194a0 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20  T_ALLOC], *p;.  
194b0 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28  int i;.  memset(
194c0 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29  a, 0, sizeof(a))
194d0 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29  ;.  while( pIn )
194e0 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20  {.    p = pIn;. 
194f0 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72     pIn = p->pDir
19500 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74  ty;.    p->pDirt
19510 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  y = 0;.    for(i
19520 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43  =0; i<N_SORT_BUC
19530 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  KET-1; i++){.   
19540 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29     if( a[i]==0 )
19550 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d  {.        a[i] =
19560 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   p;.        brea
19570 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
19580 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67          p = merg
19590 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c  e_pagelist(a[i],
195a0 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69   p);.        a[i
195b0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
195c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
195d0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20  N_SORT_BUCKET-1 
195e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65  ){.      /* Cove
195f0 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72  rage: To get her
19600 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f  e, there need to
19610 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55   be 2^(N_SORT_BU
19620 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20  CKET) .      ** 
19630 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
19640 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73  input list. This
19650 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75   is possible, bu
19660 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20  t impractical.. 
19670 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20       ** Testing 
19680 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65  this line is the
19690 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c   point of global
196a0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20   variable.      
196b0 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  ** sqlite3_pager
196c0 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a  _n_sort_bucket..
196d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
196e0 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65  [i] = merge_page
196f0 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
19700 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61     }.  }.  p = a
19710 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  [0];.  for(i=1; 
19720 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b  i<N_SORT_BUCKET;
19730 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d   i++){.    p = m
19740 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c  erge_pagelist(p,
19750 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65   a[i]);.  }.  re
19760 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
19770 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66   Given a list of
19780 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65   pages (connecte
19790 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  d by the PgHdr.p
197a0 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77  Dirty pointer) w
197b0 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e  rite.** every on
197c0 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
197d0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
197e0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61  base file and ma
197f0 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61  rk them all.** a
19800 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74  s clean..*/.stat
19810 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
19820 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
19830 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
19840 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 50 67  er *pPager;.  Pg
19850 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  Hdr *p;.  int rc
19860 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ;..  if( pList==
19870 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
19880 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
19890 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
198a0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
198b0 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
198c0 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
198d0 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
198e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
198f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19900 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
19910 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
19920 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
19930 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20  wing.  ** calls 
19940 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  to sqlite3OsLock
19950 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20  () are no-ops.. 
19960 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
19970 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
19980 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
19990 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
199a0 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
199b0 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
199c0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
199d0 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
199e0 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
199f0 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
19a00 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
19a10 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
19a20 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
19a30 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
19a40 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
19a50 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
19a60 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
19a70 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
19a80 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
19a90 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
19aa0 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
19ab0 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
19ac0 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
19ad0 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
19ae0 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
19af0 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
19b00 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
19b10 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
19b20 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
19b30 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
19b40 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
19b50 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
19b60 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
19b70 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
19b80 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
19b90 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
19ba0 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
19bb0 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
19bc0 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
19bd0 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
19be0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
19bf0 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
19c00 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
19c10 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
19c20 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
19c30 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
19c40 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
19c50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19c60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
19c70 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74  ..  pList = sort
19c80 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29  _pagelist(pList)
19c90 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
19ca0 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
19cb0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
19cc0 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 70 2d  >dirty );.    p-
19cd0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  >dirty = 0;.  }.
19ce0 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
19cf0 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  {..    /* If the
19d00 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
19d10 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
19d20 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
19d30 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
19d40 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
19d50 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
19d60 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
19d70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19d80 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
19d90 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
19da0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
19db0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  ->zFilename,.   
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
19de0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
19df0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
19e00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
19e10 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
19e20 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
19e30 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
19e40 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
19e50 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
19e60 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
19e70 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
19e80 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
19e90 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
19ea0 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
19eb0 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
19ec0 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
19ed0 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
19ee0 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
19ef0 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
19f00 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
19f10 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
19f20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
19f30 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
19f40 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
19f50 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70  fset = (pList->p
19f60 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
19f70 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
19f80 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
19f90 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
19fa0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
19fb0 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
19fc0 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41  no, 6);.      PA
19fd0 47 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45  GERTRACE4("STORE
19fe0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
19ff0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1a010 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1a020 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65  List->pgno, page
1a030 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
1a040 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
1a050 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
1a060 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73  n", pPager, pLis
1a070 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  t->pgno));.     
1a080 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1a090 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
1a0a0 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
1a0b0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1a0c0 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
1a0d0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1a0e0 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
1a0f0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1a100 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
1a110 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
1a120 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  ist->pgno==1 ){.
1a130 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1a140 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1a150 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
1a160 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1a170 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1a180 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
1a190 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
1a1a0 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
1a1b0 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
1a1c0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1a1d0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1a1e0 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
1a1f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
1a200 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1a210 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1a220 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
1a230 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
1a240 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
1a250 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
1a260 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
1a270 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
1a280 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a290 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
1a2a0 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
1a2b0 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
1a2c0 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
1a2d0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1a2e0 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
1a2f0 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
1a300 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
1a310 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
1a320 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
1a330 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
1a340 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
1a350 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
1a360 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
1a370 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1a380 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 73   /* Verify the s
1a390 61 6e 69 74 79 20 6f 66 20 74 68 65 20 64 69 72  anity of the dir
1a3a0 74 79 20 6c 69 73 74 20 77 68 65 6e 20 77 65 20  ty list when we 
1a3b0 61 72 65 20 72 75 6e 6e 69 6e 67 0a 20 20 2a 2a  are running.  **
1a3c0 20 69 6e 20 64 65 62 75 67 67 69 6e 67 20 6d 6f   in debugging mo
1a3d0 64 65 2e 20 20 54 68 69 73 20 69 73 20 65 78 70  de.  This is exp
1a3e0 65 6e 73 69 76 65 2c 20 73 6f 20 64 6f 20 6e 6f  ensive, so do no
1a3f0 74 0a 20 20 2a 2a 20 64 6f 20 74 68 69 73 20 6f  t.  ** do this o
1a400 6e 20 61 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  n a normal build
1a410 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 20 3d 20  . */.  int n1 = 
1a420 30 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 30 3b  0;.  int n2 = 0;
1a430 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 66  .  PgHdr *p;.  f
1a440 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
1a450 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
1a460 41 6c 6c 29 7b 20 69 66 28 20 70 2d 3e 64 69 72  All){ if( p->dir
1a470 74 79 20 29 20 6e 31 2b 2b 3b 20 7d 0a 20 20 66  ty ) n1++; }.  f
1a480 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 44 69  or(p=pPager->pDi
1a490 72 74 79 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  rty; p; p=p->pDi
1a4a0 72 74 79 29 7b 20 6e 32 2b 2b 3b 20 7d 0a 20 20  rty){ n2++; }.  
1a4b0 61 73 73 65 72 74 28 20 6e 31 3d 3d 6e 32 20 29  assert( n1==n2 )
1a4c0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  ;.#endif..  retu
1a4d0 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74  rn pPager->pDirt
1a4e0 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
1a4f0 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 69 73  rn 1 if there is
1a500 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f   a hot journal o
1a510 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
1a520 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72  r..** A hot jour
1a530 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
1a540 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
1a550 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ed back..**.** I
1a560 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
1a570 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1a580 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
1a590 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
1a5a0 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
1a5b0 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
1a5c0 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
1a5d0 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
1a5e0 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
1a5f0 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
1a600 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74  .  Just delete t
1a610 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
1a620 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76  * Return negativ
1a630 65 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 64  e if unable to d
1a640 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 74 61  etermine the sta
1a650 74 75 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tus of the journ
1a660 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  al..**.** This r
1a670 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
1a680 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
1a690 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65   file to examine
1a6a0 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 2e   its.** content.
1a6b0 20 20 48 65 6e 63 65 2c 20 74 68 65 20 6a 6f 75    Hence, the jou
1a6c0 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
1a6d0 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  in the name of a
1a6e0 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
1a6f0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 68 61 73  al file that has
1a700 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 61   been deleted, a
1a710 6e 64 20 68 65 6e 63 65 20 6e 6f 74 20 62 65 20  nd hence not be 
1a720 68 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74 68 65 20  hot.  Or.** the 
1a730 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  header of the jo
1a740 75 72 6e 61 6c 20 6d 69 67 68 74 20 62 65 20 7a  urnal might be z
1a750 65 72 6f 65 64 20 6f 75 74 2e 20 20 54 68 69 73  eroed out.  This
1a760 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73   routine.** does
1a770 20 6e 6f 74 20 64 69 73 63 6f 76 65 72 20 74 68   not discover th
1a780 65 73 65 20 63 61 73 65 73 20 6f 66 20 61 20 6e  ese cases of a n
1a790 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 2d  on-hot journal -
1a7a0 20 69 66 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   if the.** journ
1a7b0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
1a7c0 6e 64 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20  nd is not empty 
1a7d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73  this routine ass
1a7e0 75 6d 65 73 20 69 74 0a 2a 2a 20 69 73 20 68 6f  umes it.** is ho
1a7f0 74 2e 20 20 54 68 65 20 70 61 67 65 72 5f 70 6c  t.  The pager_pl
1a800 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
1a810 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
1a820 68 61 74 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  hat the.** journ
1a830 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
1a840 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 77 69  eally hot and wi
1a850 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61  ll no-op..*/.sta
1a860 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
1a870 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
1a880 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ger){.  sqlite3_
1a890 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
1a8a0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
1a8b0 72 63 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  rc;.  if( !pPage
1a8c0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20  r->useJournal ) 
1a8d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1a8e0 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  !pPager->fd->pMe
1a8f0 74 68 6f 64 73 20 29 20 72 65 74 75 72 6e 20 30  thods ) return 0
1a900 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1a910 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
1a920 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1a930 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
1a940 58 49 53 54 53 29 3b 0a 20 20 69 66 28 20 72 63  XISTS);.  if( rc
1a950 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
1a960 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
1a970 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
1a980 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65  servedLock(pPage
1a990 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 65  r->fd) ){.    re
1a9a0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
1a9b0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
1a9c0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
1a9d0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1a9e0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
1a9f0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1aa00 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1aa10 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1aa20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
1aa30 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66  ../*.** Try to f
1aa40 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
1aa50 65 20 63 61 63 68 65 20 74 68 61 74 20 63 61 6e  e cache that can
1aa60 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a   be recycled. .*
1aa70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1aa80 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  e may return SQL
1aa90 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
1aaa0 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45  E_FULL or SQLITE
1aab0 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73  _OK. It .** does
1aac0 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50 61   not set the pPa
1aad0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61 72  ger->errCode var
1aae0 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
1aaf0 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79 63   int pager_recyc
1ab00 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
1ab10 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b  , PgHdr **ppPg){
1ab20 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
1ab30 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f   *ppPg = 0;..  /
1ab40 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
1ab50 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
1ab60 63 74 69 6f 6e 20 75 6e 6c 65 73 73 20 74 68 65  ction unless the
1ab70 20 70 61 67 65 72 20 6f 62 6a 65 63 74 0a 20 20   pager object.  
1ab80 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
1ab90 20 70 50 61 67 65 72 20 68 61 73 20 61 74 20 6c   pPager has at l
1aba0 65 61 73 74 20 6f 6e 65 20 66 72 65 65 20 70 61  east one free pa
1abb0 67 65 20 28 70 61 67 65 20 77 69 74 68 20 6e 52  ge (page with nR
1abc0 65 66 3d 3d 30 29 2e 0a 20 20 2a 2f 20 0a 20 20  ef==0)..  */ .  
1abd0 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29 3b 0a  assert(!MEMDB);.
1abe0 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
1abf0 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b 0a 0a 20  >lru.pFirst);.. 
1ac00 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20   /* Find a page 
1ac10 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79  to recycle.  Try
1ac20 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67   to locate a pag
1ac30 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a  e that does not.
1ac40 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20    ** require us 
1ac50 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29  to do an fsync()
1ac60 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   on the journal.
1ac70 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50  .  */.  pPg = pP
1ac80 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
1ac90 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66  Synced;..  /* If
1aca0 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69   we could not fi
1acb0 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64  nd a page that d
1acc0 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
1acd0 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20  an fsync().  ** 
1ace0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1acf0 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74  ile then fsync t
1ad00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1ad10 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a    This is a.  **
1ad20 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
1ad30 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b  tion, so we work
1ad40 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69   hard to avoid i
1ad50 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65  t.  But sometime
1ad60 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20  s.  ** it can't 
1ad70 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a  be helped..  */.
1ad80 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20    if( pPg==0 && 
1ad90 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1ada0 73 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 63  st){.    int iDc
1adb0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
1adc0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1add0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
1ade0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63     int rc = sync
1adf0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1ae00 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
1ae10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1ae20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1ae30 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
1ae40 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
1ae50 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1ae60 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
1ae70 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
1ae80 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61  nc mode, write a
1ae90 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61   new journal hea
1aea0 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  der into the.   
1aeb0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
1aec0 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  le. This is done
1aed0 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d   to avoid ever m
1aee0 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e  odifying a journ
1aef0 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64  al.      ** head
1af00 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c  er that is invol
1af10 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  ved in the rollb
1af20 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61  ack of pages tha
1af30 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  t have.      ** 
1af40 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1af50 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
1af60 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74 68  base (in case th
1af70 65 20 68 65 61 64 65 72 20 69 73 0a 20 20 20 20  e header is.    
1af80 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65    ** trashed whe
1af90 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
1afa0 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20   is updated)..  
1afb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
1afc0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
1afd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1afe0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1aff0 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  > 0 );.      ass
1b000 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
1b010 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  otSync==0 );.   
1b020 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
1b030 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
1b040 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
1b050 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1b060 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1b070 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70     }.    pPg = p
1b080 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
1b090 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  t;.  }..  assert
1b0a0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
1b0b0 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
1b0c0 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61  e page to the da
1b0d0 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69  tabase file if i
1b0e0 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f  t is dirty..  */
1b0f0 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
1b100 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  y ){.    int rc;
1b110 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1b120 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
1b130 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
1b140 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  Pg);.    pPg->di
1b150 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  rty = 1;.    pPg
1b160 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
1b170 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
1b180 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67  te_pagelist( pPg
1b190 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   );.    pPg->dir
1b1a0 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ty = 0;.    if( 
1b1b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b1c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1b1d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
1b1e0 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
1b1f0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
1b200 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
1b210 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72  recycling is mar
1b220 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
1b230 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a  lback, then.  **
1b240 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20   set the global 
1b250 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
1b260 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c  lag, thus disabl
1b270 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  ing the.  ** sql
1b280 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1b290 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61  lback() optimiza
1b2a0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73  tion for the res
1b2b0 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1b2c0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69  ction..  ** It i
1b2d0 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  s necessary to d
1b2e0 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74  o this because t
1b2f0 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61  he page marked a
1b300 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20  lwaysRollback.  
1b310 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f  ** might be relo
1b320 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20  aded at a later 
1b330 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74  time but at that
1b340 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20   point we won't 
1b350 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68  remember.  ** th
1b360 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64  at is was marked
1b370 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e   alwaysRollback.
1b380 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
1b390 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74  t all pages must
1b3a0 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20  .  ** be marked 
1b3b0 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
1b3c0 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f  k from here on o
1b3d0 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ut..  */.  if( p
1b3e0 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
1b3f0 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  ck ){.    IOTRAC
1b400 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42  E(("ALWAYS_ROLLB
1b410 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  ACK %p\n", pPage
1b420 72 29 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r)).    pPager->
1b430 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
1b440 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   1;.  }..  /* Un
1b450 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67  link the old pag
1b460 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
1b470 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73  list and the has
1b480 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75  h table.  */.  u
1b490 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
1b4a0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
1b4b0 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70 70  gno==0 );..  *pp
1b4c0 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75  Pg = pPg;.  retu
1b4d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b4e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1b4f0 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
1b500 41 47 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68  AGEMENT./*.** Th
1b510 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1b520 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75  alled to free su
1b530 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69  perfluous dynami
1b540 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
1b550 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62  memory.** held b
1b560 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73 74  y the pager syst
1b570 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73  em. Memory in us
1b580 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20  e by any SQLite 
1b590 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  pager allocated.
1b5a0 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ** by the curren
1b5b0 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65 20  t thread may be 
1b5c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 65 64  sqlite3_free()ed
1b5d0 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20  ..**.** nReq is 
1b5e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1b5f0 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  tes of memory re
1b600 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69  quired. Once thi
1b610 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65  s much has.** be
1b620 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65  en released, the
1b630 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1b640 73 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  s. The return va
1b650 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c  lue is the total
1b660 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62   number .** of b
1b670 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72  ytes of memory r
1b680 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eleased..*/.int 
1b690 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65  sqlite3PagerRele
1b6a0 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52  aseMemory(int nR
1b6b0 65 71 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6c 65  eq){.  int nRele
1b6c0 61 73 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20  ased = 0;       
1b6d0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d     /* Bytes of m
1b6e0 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 20 73  emory released s
1b6f0 6f 20 66 61 72 20 2a 2f 0a 20 20 50 61 67 65 72  o far */.  Pager
1b700 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20   *pPager;       
1b710 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1b720 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 72  oping over pager
1b730 73 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c  s */.  BusyHandl
1b740 65 72 20 2a 73 61 76 65 64 42 75 73 79 3b 20 20  er *savedBusy;  
1b750 20 20 20 2f 2a 20 53 61 76 65 64 20 63 6f 70 79     /* Saved copy
1b760 20 6f 66 20 74 68 65 20 62 75 73 79 20 68 61 6e   of the busy han
1b770 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  dler */.  int rc
1b780 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1b790 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20   /* Acquire the 
1b7a0 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e  memory-managemen
1b7b0 74 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 23 69 66  t mutex.  */.#if
1b7c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45  ndef SQLITE_MUTE
1b7d0 58 5f 4e 4f 4f 50 0a 20 20 73 71 6c 69 74 65 33  X_NOOP.  sqlite3
1b7e0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
1b7f0 20 20 20 20 20 2f 2a 20 54 68 65 20 4d 45 4d 32       /* The MEM2
1b800 20 6d 75 74 65 78 20 2a 2f 0a 20 20 6d 75 74 65   mutex */.  mute
1b810 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
1b820 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
1b830 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32  UTEX_STATIC_MEM2
1b840 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
1b850 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1b860 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69  mutex);..  /* Si
1b870 67 6e 61 6c 20 61 6c 6c 20 64 61 74 61 62 61 73  gnal all databas
1b880 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1b890 61 74 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  at memory manage
1b8a0 6d 65 6e 74 20 77 61 6e 74 73 0a 20 20 2a 2a 20  ment wants.  ** 
1b8b0 74 6f 20 68 61 76 65 20 61 63 63 65 73 73 20 74  to have access t
1b8c0 6f 20 74 68 65 20 70 61 67 65 72 73 2e 0a 20 20  o the pagers..  
1b8d0 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d  */.  for(pPager=
1b8e0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
1b8f0 3b 20 70 50 61 67 65 72 3b 20 70 50 61 67 65 72  ; pPager; pPager
1b900 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b  =pPager->pNext){
1b910 0a 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49  .     pPager->iI
1b920 6e 55 73 65 4d 4d 20 3d 20 31 3b 0a 20 20 7d 0a  nUseMM = 1;.  }.
1b930 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
1b940 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6e 52 65 71  LITE_OK && (nReq
1b950 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c  <0 || nReleased<
1b960 6e 52 65 71 29 20 29 7b 0a 20 20 20 20 50 67 48  nReq) ){.    PgH
1b970 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 50 67 48  dr *pPg;.    PgH
1b980 64 72 20 2a 70 52 65 63 79 63 6c 65 64 3b 0a 20  dr *pRecycled;. 
1b990 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  .    /* Try to f
1b9a0 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65  ind a page to re
1b9b0 63 79 63 6c 65 20 74 68 61 74 20 64 6f 65 73 20  cycle that does 
1b9c0 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20 73 79  not require a sy
1b9d0 6e 63 28 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20  nc(). If.    ** 
1b9e0 74 68 69 73 20 69 73 20 6e 6f 74 20 70 6f 73 73  this is not poss
1b9f0 69 62 6c 65 2c 20 66 69 6e 64 20 6f 6e 65 20 74  ible, find one t
1ba00 68 61 74 20 64 6f 65 73 20 72 65 71 75 69 72 65  hat does require
1ba10 20 61 20 73 79 6e 63 28 29 2e 0a 20 20 20 20 2a   a sync()..    *
1ba20 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  /.    sqlite3_mu
1ba30 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
1ba40 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
1ba50 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1ba60 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 70 50 67  C_LRU));.    pPg
1ba70 20 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67   = sqlite3LruPag
1ba80 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63  eList.pFirstSync
1ba90 65 64 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ed;.    while( p
1baa0 50 67 20 26 26 20 28 70 50 67 2d 3e 6e 65 65 64  Pg && (pPg->need
1bab0 53 79 6e 63 20 7c 7c 20 70 50 67 2d 3e 70 50 61  Sync || pPg->pPa
1bac0 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 29 20 29  ger->iInUseDB) )
1bad0 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  {.      pPg = pP
1bae0 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a  g->gfree.pNext;.
1baf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
1bb00 50 67 20 29 7b 0a 20 20 20 20 20 20 70 50 67 20  Pg ){.      pPg 
1bb10 3d 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  = sqlite3LruPage
1bb20 4c 69 73 74 2e 70 46 69 72 73 74 3b 0a 20 20 20  List.pFirst;.   
1bb30 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26 26     while( pPg &&
1bb40 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49   pPg->pPager->iI
1bb50 6e 55 73 65 44 42 20 29 7b 0a 20 20 20 20 20 20  nUseDB ){.      
1bb60 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67 66 72    pPg = pPg->gfr
1bb70 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  ee.pNext;.      
1bb80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1bb90 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1bba0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
1bbb0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1bbc0 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 0a  _STATIC_LRU));..
1bbd0 20 20 20 20 2f 2a 20 49 66 20 70 50 67 3d 3d 30      /* If pPg==0
1bbe0 2c 20 74 68 65 6e 20 74 68 65 20 62 6c 6f 63 6b  , then the block
1bbf0 20 61 62 6f 76 65 20 68 61 73 20 66 61 69 6c 65   above has faile
1bc00 64 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  d to find a page
1bc10 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 63 79 63   to.    ** recyc
1bc20 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  le. In this case
1bc30 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20 2d 20   return early - 
1bc40 6e 6f 20 66 75 72 74 68 65 72 20 6d 65 6d 6f 72  no further memor
1bc50 79 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  y will.    ** be
1bc60 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 20 20 2a   released..    *
1bc70 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 20 29  /.    if( !pPg )
1bc80 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 50 61   break;..    pPa
1bc90 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1bca0 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 21 70  r;.    assert(!p
1bcb0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20  Pg->needSync || 
1bcc0 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75  pPg==pPager->lru
1bcd0 2e 70 46 69 72 73 74 29 3b 0a 20 20 20 20 61 73  .pFirst);.    as
1bce0 73 65 72 74 28 70 50 67 2d 3e 6e 65 65 64 53 79  sert(pPg->needSy
1bcf0 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65  nc || pPg==pPage
1bd00 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e  r->lru.pFirstSyn
1bd10 63 65 64 29 3b 0a 20 20 0a 20 20 20 20 73 61 76  ced);.  .    sav
1bd20 65 64 42 75 73 79 20 3d 20 70 50 61 67 65 72 2d  edBusy = pPager-
1bd30 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20  >pBusyHandler;. 
1bd40 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
1bd50 48 61 6e 64 6c 65 72 20 3d 20 30 3b 0a 20 20 20  Handler = 0;.   
1bd60 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79   rc = pager_recy
1bd70 63 6c 65 28 70 50 61 67 65 72 2c 20 26 70 52 65  cle(pPager, &pRe
1bd80 63 79 63 6c 65 64 29 3b 0a 20 20 20 20 70 50 61  cycled);.    pPa
1bd90 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
1bda0 72 20 3d 20 73 61 76 65 64 42 75 73 79 3b 0a 20  r = savedBusy;. 
1bdb0 20 20 20 61 73 73 65 72 74 28 70 52 65 63 79 63     assert(pRecyc
1bdc0 6c 65 64 3d 3d 70 50 67 20 7c 7c 20 72 63 21 3d  led==pPg || rc!=
1bdd0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
1bde0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bdf0 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65  K ){.      /* We
1be00 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65  've found a page
1be10 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69   to free. At thi
1be20 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65  s point the page
1be30 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20   has been .     
1be40 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   ** removed from
1be50 20 74 68 65 20 70 61 67 65 20 68 61 73 68 2d 74   the page hash-t
1be60 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20  able, free-list 
1be70 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20  and synced-list 
1be80 0a 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73  .      ** (pFirs
1be90 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20  tSynced). It is 
1bea0 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c  still in the all
1beb0 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69   pages (pAll) li
1bec0 73 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 52 65  st. .      ** Re
1bed0 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69  move it from thi
1bee0 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72  s list before fr
1bef0 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2a 0a  eeing..      **.
1bf00 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43        ** Todo: C
1bf10 68 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70  heck the Pager.p
1bf20 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b  Stmt list to mak
1bf30 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20 4f  e sure this is O
1bf40 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 2a 2a 20  k. It .      ** 
1bf50 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75  probably is thou
1bf60 67 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  gh..      */.   
1bf70 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a     PgHdr *pTmp;.
1bf80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1bf90 67 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  g );.      if( p
1bfa0 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  Pg==pPager->pAll
1bfb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70 50 61   ){.         pPa
1bfc0 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d  ger->pAll = pPg-
1bfd0 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
1bfe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bff0 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67 65 72  for( pTmp=pPager
1c000 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e  ->pAll; pTmp->pN
1c010 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d  extAll!=pPg; pTm
1c020 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p=pTmp->pNextAll
1c030 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 70 54 6d   ){}.        pTm
1c040 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  p->pNextAll = pP
1c050 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
1c060 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 6c 65     }.      nRele
1c070 61 73 65 64 20 2b 3d 20 28 0a 20 20 20 20 20 20  ased += (.      
1c080 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 67 29      sizeof(*pPg)
1c090 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
1c0a0 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 2b 20  ize.          + 
1c0b0 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50  sizeof(u32) + pP
1c0c0 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20  ager->nExtra.   
1c0d0 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73         + MEMDB*s
1c0e0 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
1c0f0 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
1c100 20 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45   IOTRACE(("PGFRE
1c110 45 20 25 70 20 25 64 20 2a 5c 6e 22 2c 20 70 50  E %p %d *\n", pP
1c120 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
1c130 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
1c140 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1c150 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b  r_pgfree_count);
1c160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1c170 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61 29 3b  ree(pPg->pData);
1c180 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1c190 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ree(pPg);.      
1c1a0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b  pPager->nPage--;
1c1b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c1c0 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63    /* An error oc
1c1d0 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  cured whilst wri
1c1e0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
1c1f0 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20  base file or .  
1c200 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69      ** journal i
1c210 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  n pager_recycle(
1c220 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  ). The error is 
1c230 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20  not returned to 
1c240 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 61  the .      ** ca
1c250 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e  ller of this fun
1c260 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20  ction. Instead, 
1c270 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 72  set the Pager.er
1c280 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a  rCode variable..
1c290 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72        ** The err
1c2a0 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  or will be retur
1c2b0 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
1c2c0 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68  (or users, in th
1c2d0 65 20 63 61 73 65 20 0a 20 20 20 20 20 20 2a 2a  e case .      **
1c2e0 20 6f 66 20 61 20 73 68 61 72 65 64 20 70 61 67   of a shared pag
1c2f0 65 72 20 63 61 63 68 65 29 20 6f 66 20 74 68 65  er cache) of the
1c300 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68   pager for which
1c310 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
1c320 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
1c330 20 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20     assert(.     
1c340 20 20 20 20 20 28 72 63 26 30 78 66 66 29 3d 3d       (rc&0xff)==
1c350 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a  SQLITE_IOERR ||.
1c360 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
1c370 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
1c380 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
1c390 45 5f 42 55 53 59 0a 20 20 20 20 20 20 29 3b 0a  E_BUSY.      );.
1c3a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1c3b0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1c3c0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1c3d0 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
1c3e0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
1c3f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c    }.  }..  /* Cl
1c400 65 61 72 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d  ear the memory m
1c410 61 6e 61 67 65 6d 65 6e 74 20 66 6c 61 67 73 20  anagement flags 
1c420 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20  and release the 
1c430 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20 66 6f 72  mutex.  */.  for
1c440 28 70 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50  (pPager=sqlite3P
1c450 61 67 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72  agerList; pPager
1c460 3b 20 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d  ; pPager=pPager-
1c470 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50  >pNext){.     pP
1c480 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d  ager->iInUseMM =
1c490 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
1c4a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
1c4b0 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75  tex);..  /* Retu
1c4c0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1c4d0 20 62 79 74 65 73 20 72 65 6c 65 61 73 65 64 0a   bytes released.
1c4e0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 52    */.  return nR
1c4f0 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69  eleased;.}.#endi
1c500 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
1c510 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
1c520 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  MENT */../*.** R
1c530 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1c540 6f 66 20 70 61 67 65 20 70 50 67 20 6f 75 74 20  of page pPg out 
1c550 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1c560 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1c570 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1c580 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1c590 48 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70  Hdr *pPg, Pgno p
1c5a0 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
1c5b0 20 20 69 36 34 20 6f 66 66 73 65 74 3b 0a 20 20    i64 offset;.  
1c5c0 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30  assert( MEMDB==0
1c5d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61   );.  assert(pPa
1c5e0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
1c5f0 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  s||pPager->tempF
1c600 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ile);.  if( !pPa
1c610 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
1c620 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  s ){.    return 
1c630 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1c640 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6f  RT_READ;.  }.  o
1c650 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
1c660 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
1c670 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73  geSize;.  rc = s
1c680 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
1c690 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
1c6a0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
1c6b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
1c6c0 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45 52 5f  ffset);.  PAGER_
1c6d0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
1c6e0 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29  er_readdb_count)
1c6f0 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70  ;.  PAGER_INCR(p
1c700 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
1c710 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
1c720 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1c730 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20  , pgno));.  if( 
1c740 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d  pgno==1 ){.    m
1c750 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1c760 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
1c770 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
1c780 70 50 67 29 29 5b 32 34 5d 2c 0a 20 20 20 20 20  pPg))[24],.     
1c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7b0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
1c7c0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1c7d0 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45  rs));.  }.  CODE
1c7e0 43 31 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  C1(pPager, PGHDR
1c7f0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
1c800 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
1c810 50 41 47 45 52 54 52 41 43 45 34 28 22 46 45 54  PAGERTRACE4("FET
1c820 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1c830 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1c840 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1c850 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1c860 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  ->pgno, pager_pa
1c870 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20  gehash(pPg));.  
1c880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1c890 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1c8a0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1c8b0 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61 72 65  obtain the share
1c8c0 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64 20  d lock required 
1c8d0 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d  before.** data m
1c8e0 61 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ay be read from 
1c8f0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
1c900 20 49 66 20 74 68 65 20 73 68 61 72 65 64 20 6c   If the shared l
1c910 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ock has already.
1c920 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ** been obtained
1c930 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1c940 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
1c950 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  * Immediately af
1c960 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  ter obtaining th
1c970 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 28 69  e shared lock (i
1c980 66 20 72 65 71 75 69 72 65 64 29 2c 20 74 68 69  f required), thi
1c990 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68  s function.** ch
1c9a0 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a  ecks for a hot-j
1c9b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
1c9c0 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e  one is found, an
1c9d0 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62   emergency rollb
1c9e0 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72  ack.** is perfor
1c9f0 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  med immediately.
1ca00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1ca10 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50  agerSharedLock(P
1ca20 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ca30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ca40 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 48 6f 74  _OK;.  int isHot
1ca50 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   = 0;..  /* If t
1ca60 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20  his database is 
1ca70 6f 70 65 6e 65 64 20 66 6f 72 20 65 78 63 6c 75  opened for exclu
1ca80 73 69 76 65 20 61 63 63 65 73 73 2c 20 68 61 73  sive access, has
1ca90 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1caa0 0a 20 20 2a 2a 20 70 61 67 65 20 72 65 66 65 72  .  ** page refer
1cab0 65 6e 63 65 73 20 61 6e 64 20 69 73 20 69 6e 20  ences and is in 
1cac0 61 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20  an error-state, 
1cad0 6e 6f 77 20 69 73 20 74 68 65 20 63 68 61 6e 63  now is the chanc
1cae0 65 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20  e to clear.  ** 
1caf0 74 68 65 20 65 72 72 6f 72 2e 20 44 69 73 63 61  the error. Disca
1cb00 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
1cb10 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
1cb20 68 65 20 61 6e 64 20 74 72 65 61 74 20 61 6e 79  he and treat any
1cb30 0a 20 20 2a 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e  .  ** open journ
1cb40 61 6c 20 66 69 6c 65 20 61 73 20 61 20 68 6f 74  al file as a hot
1cb50 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  -journal..  */. 
1cb60 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
1cb70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1cb80 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
1cb90 6e 52 65 66 3d 3d 30 20 26 26 20 70 50 61 67 65  nRef==0 && pPage
1cba0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
1cbb0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1cbc0 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
1cbd0 20 20 20 69 73 48 6f 74 20 3d 20 31 3b 0a 20 20     isHot = 1;.  
1cbe0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 72 65    }.    pager_re
1cbf0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1cc00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1cc10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cc20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
1cc30 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e  ager is still in
1cc40 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c   an error state,
1cc50 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e   do not proceed.
1cc60 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a   The error .  **
1cc70 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63   state will be c
1cc80 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70  leared at some p
1cc90 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
1cca0 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65  re when all page
1ccb0 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65   .  ** reference
1ccc0 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e  s are dropped an
1ccd0 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e 20  d the cache can 
1cce0 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20  be discarded..  
1ccf0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1cd00 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
1cd10 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
1cd20 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
1cd30 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1cd40 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69  rrCode;.  }..  i
1cd50 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1cd60 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
1cd70 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 73  | isHot ){.    s
1cd80 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1cd90 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
1cda0 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
1cdb0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1cdc0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
1cdd0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
1cde0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
1cdf0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  k ){.        rc 
1ce00 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
1ce10 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
1ce20 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
1ce30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ce40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ce50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ce60 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
1ce70 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  NLOCK );.       
1ce80 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
1ce90 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1cea0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1ceb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1cec0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
1ced0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
1cee0 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49   }.  .      /* I
1cef0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
1cf00 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
1cf10 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
1cf20 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
1cf30 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1cf40 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
1cf50 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
1cf60 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
1cf70 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a  deleted..      *
1cf80 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  /.      rc = has
1cf90 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
1cfa0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1cfb0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  <0 ){.        rc
1cfc0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1cfd0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67  NOMEM;.        g
1cfe0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
1cff0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1d000 3d 3d 31 20 7c 7c 20 69 73 48 6f 74 20 29 7b 0a  ==1 || isHot ){.
1d010 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61          /* Get a
1d020 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1d030 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1d040 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
1d050 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
1d060 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20     ** important 
1d070 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20  that a RESERVED 
1d080 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61  lock is not obta
1d090 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20  ined on the way 
1d0a0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
1d0b0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
1d0c0 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e  . If it were, an
1d0d0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
1d0e0 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20  ght open the.   
1d0f0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
1d100 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
1d110 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
1d120 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
1d130 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  at the.        *
1d140 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
1d150 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
1d160 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
1d170 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69   still rolling i
1d180 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61  t .        ** ba
1d190 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a  ck..        ** .
1d1a0 20 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75          ** Becau
1d1b0 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
1d1c0 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
1d1d0 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
1d1e0 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20  ed, the.        
1d1f0 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73  ** second proces
1d200 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68  s will get to th
1d210 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
1d220 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
1d230 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61  .        ** obta
1d240 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55  in its own EXCLU
1d250 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1d260 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1d270 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d280 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1d290 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c  tate<EXCLUSIVE_L
1d2a0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OCK ){.         
1d2b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
1d2c0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
1d2d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
1d2e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1d2f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d300 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d310 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
1d320 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
1d330 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
1d340 64 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  d;.          }. 
1d350 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1d360 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
1d370 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
1d380 20 20 7d 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a    }. .        /*
1d390 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
1d3a0 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  l for read/write
1d3b0 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73   access. This is
1d3c0 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20   because in .   
1d3d0 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
1d3e0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
1d3f0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1d400 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
1d410 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  pen and.        
1d420 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64  ** possibly used
1d430 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
1d440 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20  on later on. On 
1d450 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68  some systems, th
1d460 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73 54  e.        ** OsT
1d470 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
1d480 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65  sed in exclusive
1d490 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73  -access mode als
1d4a0 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  o requires.     
1d4b0 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69     ** a read/wri
1d4c0 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  te file handle..
1d4d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d4e0 20 20 20 69 66 28 20 21 69 73 48 6f 74 20 26 26     if( !isHot &&
1d4f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1d500 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
1d510 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73       int res = s
1d520 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1d530 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  Vfs,pPager->zJou
1d540 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45  rnal,SQLITE_ACCE
1d550 53 53 5f 45 58 49 53 54 53 29 3b 0a 20 20 20 20  SS_EXISTS);.    
1d560 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 31        if( res==1
1d570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d580 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
1d590 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
1d5a0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
1d5b0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
1d5c0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1d5d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
1d5e0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
1d5f0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
1d600 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1d610 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
1d620 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1d630 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
1d640 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
1d650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
1d660 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
1d670 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
1d680 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20 20  hods );.        
1d690 20 20 20 20 69 66 28 20 66 6f 75 74 26 53 51 4c      if( fout&SQL
1d6a0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1d6b0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
1d6c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1d6d0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20  USY;.           
1d6e0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
1d6f0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
1d700 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1d710 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1d720 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
1d730 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1d740 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  e journal does n
1d750 6f 74 20 65 78 69 73 74 2c 20 74 68 61 74 20 6d  ot exist, that m
1d760 65 61 6e 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  eans some other 
1d770 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 20 20  process.        
1d780 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
1d790 64 79 20 72 6f 6c 6c 65 64 20 69 74 20 62 61 63  dy rolled it bac
1d7a0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  k */.           
1d7b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1d7c0 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  Y;.          }el
1d7d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1d7e0 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 4f 73 41  /* If sqlite3OsA
1d7f0 63 63 65 73 73 28 29 20 72 65 74 75 72 6e 73 20  ccess() returns 
1d800 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
1d810 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 69 74 0a  , that means it.
1d820 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66              ** f
1d830 61 69 6c 65 64 20 61 20 6d 65 6d 6f 72 79 20 61  ailed a memory a
1d840 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  llocation */.   
1d850 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1d860 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1d870 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1d880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d890 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d8a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
1d8b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc!=SQLITE_NO
1d8c0 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c 49 54  MEM && rc!=SQLIT
1d8d0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 20 0a  E_IOERR_UNLOCK .
1d8e0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 72 63             && rc
1d8f0 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  !=SQLITE_IOERR_N
1d900 4f 4d 45 4d 20 0a 20 20 20 20 20 20 20 20 20 20  OMEM .          
1d910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1d920 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1d930 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d940 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
1d950 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
1d960 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1d970 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
1d980 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1d990 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
1d9a0 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  0;.        pPage
1d9b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1d9c0 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  0;.        pPage
1d9d0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
1d9e0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1d9f0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
1da00 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 50  ;. .        /* P
1da10 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
1da20 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
1da30 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
1da40 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20  se write.       
1da50 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
1da60 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
1da70 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lock..        */
1da80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
1da90 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
1daa0 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ger, 1);.       
1dab0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1dac0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1dad0 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
1dae0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
1daf0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
1db00 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
1db10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50         assert(pP
1db20 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1db30 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20  ER_SHARED || .  
1db40 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
1db50 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
1db60 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
1db70 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  e>PAGER_SHARED).
1db80 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1db90 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50   }..      if( pP
1dba0 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  ager->pAll ){.  
1dbb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
1dbc0 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73  red-lock has jus
1dbd0 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20  t been acquired 
1dbe0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1dbf0 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  file.        ** 
1dc00 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
1dc10 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
1dc20 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
1dc30 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
1dc40 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69    ** read or wri
1dc50 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  te transaction).
1dc60 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
1dc70 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
1dc80 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65         ** has be
1dc90 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
1dca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1dcb0 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68  s changed, flush
1dcc0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1dcd0 63 61 63 68 65 2e 0a 20 20 20 20 20 20 20 20 2a  cache..        *
1dce0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 61 74  *.        ** Dat
1dcf0 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
1dd00 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
1dd10 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
1dd20 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
1dd30 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20     ** at offset 
1dd40 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  24 into the file
1dd50 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f  .  The first 4 o
1dd60 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73  f these 16 bytes
1dd70 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   are.        ** 
1dd80 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72  a 32-bit counter
1dd90 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65   that is increme
1dda0 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  nted with each c
1ddb0 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20  hange.  The.    
1ddc0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
1ddd0 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
1dde0 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
1ddf0 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
1de00 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
1de10 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
1de20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
1de30 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
1de40 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
1de50 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
1de60 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
1de70 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74   .        ** det
1de80 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
1de90 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
1dea0 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
1deb0 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
1dec0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
1ded0 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
1dee0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
1def0 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73  har dbFileVers[s
1df00 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1df10 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20  FileVers)];.    
1df20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1df30 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1df40 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
1df50 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1df60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1df70 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
1df80 65 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  e;.          got
1df90 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
1dfa0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
1dfb0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
1dfc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49  0 ){.          I
1dfd0 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
1dfe0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1dff0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
1e000 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
1e010 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e020 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
1e030 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69   &dbFileVers, si
1e040 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
1e050 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20  , 24);.         
1e060 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e070 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e080 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
1e090 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e0a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e0b0 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c      memset(dbFil
1e0c0 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66  eVers, 0, sizeof
1e0d0 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
1e0e0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1e0f0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61    if( memcmp(pPa
1e100 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1e110 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
1e120 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
1e130 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1e140 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1e150 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ger);.        }.
1e160 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e170 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e180 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1e190 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
1e1a0 3c 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  <=PAGER_SHARED )
1e1b0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1e1c0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
1e1d0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
1e1e0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1e1f0 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
1e200 20 7d 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a   }.  }.. failed:
1e210 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1e220 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70  E_OK ){.    /* p
1e230 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
1e240 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63   a no-op for exc
1e250 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
1e260 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1e270 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ses. */.    page
1e280 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
1e290 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1e2a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
1e2b0 63 61 74 65 20 61 20 50 67 48 64 72 20 6f 62 6a  cate a PgHdr obj
1e2c0 65 63 74 2e 20 20 20 45 69 74 68 65 72 20 63 72  ect.   Either cr
1e2d0 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f  eate a new one o
1e2e0 72 20 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78  r reuse.** an ex
1e2f0 69 73 74 69 6e 67 20 6f 6e 65 20 74 68 61 74 20  isting one that 
1e300 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65  is not otherwise
1e310 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41   in use..**.** A
1e320 20 6e 65 77 20 50 67 48 64 72 20 73 74 72 75 63   new PgHdr struc
1e330 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
1e340 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
1e350 6c 6c 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74  llowing are.** t
1e360 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  rue:.**.**     (
1e370 31 29 20 20 57 65 20 68 61 76 65 20 6e 6f 74 20  1)  We have not 
1e380 65 78 63 65 65 64 65 64 20 6f 75 72 20 6d 61 78  exceeded our max
1e390 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63  imum allocated c
1e3a0 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20  ache size.**    
1e3b0 20 20 20 20 20 20 61 73 20 73 65 74 20 62 79 20        as set by 
1e3c0 74 68 65 20 22 50 52 41 47 4d 41 20 63 61 63 68  the "PRAGMA cach
1e3d0 65 5f 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e  e_size" command.
1e3e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20  .**.**     (2)  
1e3f0 54 68 65 72 65 20 61 72 65 20 6e 6f 20 75 6e 75  There are no unu
1e400 73 65 64 20 50 67 48 64 72 20 6f 62 6a 65 63 74  sed PgHdr object
1e410 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74  s available at t
1e420 68 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  his time..**.** 
1e430 20 20 20 20 28 33 29 20 20 54 68 69 73 20 69 73      (3)  This is
1e440 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
1e450 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
1e460 20 20 28 34 29 20 20 54 68 65 72 65 20 61 72 65    (4)  There are
1e470 20 6e 6f 20 50 67 48 64 72 20 6f 62 6a 65 63 74   no PgHdr object
1e480 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65  s that do not re
1e490 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a  quire a journal.
1e4a0 2a 2a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65  **          file
1e4b0 20 73 79 6e 63 20 61 6e 64 20 61 20 73 79 6e 63   sync and a sync
1e4c0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1e4d0 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
1e4e0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 70 72  y.**          pr
1e4f0 6f 68 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ohibited..**.** 
1e500 4f 74 68 65 72 77 69 73 65 2c 20 72 65 75 73 65  Otherwise, reuse
1e510 20 61 6e 20 65 78 69 73 74 69 6e 67 20 50 67 48   an existing PgH
1e520 64 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  dr.  In other wo
1e530 72 64 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a  rds, reuse an.**
1e540 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 20   existing PgHdr 
1e550 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
1e560 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
1e570 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
1e580 20 57 65 20 68 61 76 65 20 72 65 61 63 68 65 64   We have reached
1e590 20 6f 72 20 65 78 63 65 65 64 65 64 20 74 68 65   or exceeded the
1e5a0 20 6d 61 78 69 6d 75 6d 20 63 61 63 68 65 20 73   maximum cache s
1e5b0 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ize.**          
1e5c0 61 6c 6c 6f 77 65 64 20 62 79 20 22 50 52 41 47  allowed by "PRAG
1e5d0 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a  MA cache_size"..
1e5e0 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54  **.**     (2)  T
1e5f0 68 65 72 65 20 69 73 20 61 20 50 67 48 64 72 20  here is a PgHdr 
1e600 61 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20 50  available with P
1e610 67 48 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a  gHdr->nRef==0.**
1e620 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 57 65 20  .**     (3)  We 
1e630 61 72 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e  are not in an in
1e640 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1e650 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20  .**.**     (4)  
1e660 45 69 74 68 65 72 20 74 68 65 72 65 20 69 73 20  Either there is 
1e670 61 6e 20 61 76 61 69 6c 61 62 6c 65 20 50 67 48  an available PgH
1e680 64 72 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  dr that does not
1e690 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 20 20   need.**        
1e6a0 20 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 74    to be synced t
1e6b0 6f 20 64 69 73 6b 20 6f 72 20 65 6c 73 65 20 64  o disk or else d
1e6c0 69 73 6b 20 73 79 6e 63 69 6e 67 20 69 73 20 63  isk syncing is c
1e6d0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
1e6e0 20 20 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f       allowed..*/
1e6f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1e700 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 50 61  rAllocatePage(Pa
1e710 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
1e720 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e  dr **ppPg){.  in
1e730 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e740 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1e750 20 20 69 6e 74 20 6e 42 79 74 65 48 64 72 3b 0a    int nByteHdr;.
1e760 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e  .  /* Create a n
1e770 65 77 20 50 67 48 64 72 20 69 66 20 61 6e 79 20  ew PgHdr if any 
1e780 6f 66 20 74 68 65 20 66 6f 75 72 20 63 6f 6e 64  of the four cond
1e790 69 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a  itions defined .
1e7a0 20 20 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 6d    ** above are m
1e7b0 65 74 3a 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  et: */.  if( pPa
1e7c0 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65  ger->nPage<pPage
1e7d0 72 2d 3e 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20  r->mxPage.   || 
1e7e0 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1e7f0 73 74 3d 3d 30 20 0a 20 20 20 7c 7c 20 4d 45 4d  st==0 .   || MEM
1e800 44 42 0a 20 20 20 7c 7c 20 28 70 50 61 67 65 72  DB.   || (pPager
1e810 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
1e820 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  ed==0 && pPager-
1e830 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29 7b  >doNotSync).  ){
1e840 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
1e850 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1e860 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d  ->nPage>=pPager-
1e870 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  >nHash ){.      
1e880 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73  pager_resize_has
1e890 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a  h_table(pPager,.
1e8a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1e8b0 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36  >nHash<256 ? 256
1e8c0 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68   : pPager->nHash
1e8d0 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *2);.      if( p
1e8e0 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20  Pager->nHash==0 
1e8f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e900 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1e910 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
1e920 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20  _allocate_out;. 
1e930 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e940 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
1e950 65 72 29 3b 0a 20 20 20 20 6e 42 79 74 65 48 64  er);.    nByteHd
1e960 72 20 3d 20 73 69 7a 65 6f 66 28 2a 70 50 67 29  r = sizeof(*pPg)
1e970 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b   + sizeof(u32) +
1e980 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a   pPager->nExtra.
1e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
1e9a0 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48  MEMDB*sizeof(PgH
1e9b0 69 73 74 6f 72 79 29 3b 0a 20 20 20 20 70 50 67  istory);.    pPg
1e9c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1e9d0 63 28 20 6e 42 79 74 65 48 64 72 20 29 3b 0a 20  c( nByteHdr );. 
1e9e0 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
1e9f0 20 20 20 20 70 44 61 74 61 20 3d 20 73 71 6c 69      pData = sqli
1ea00 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67  te3_malloc( pPag
1ea10 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
1ea20 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3d        if( pData=
1ea30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1ea40 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b  lite3_free(pPg);
1ea50 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 30  .        pPg = 0
1ea60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ea70 20 20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70      pagerEnter(p
1ea80 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1ea90 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
1eaa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1eab0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  M;.      goto pa
1eac0 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
1ead0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
1eae0 65 74 28 70 50 67 2c 20 30 2c 20 6e 42 79 74 65  et(pPg, 0, nByte
1eaf0 48 64 72 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Hdr);.    pPg->p
1eb00 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20  Data = pData;.  
1eb10 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
1eb20 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d  pPager;.    pPg-
1eb30 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67  >pNextAll = pPag
1eb40 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50  er->pAll;.    pP
1eb50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
1eb60 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50  ;.    pPager->nP
1eb70 61 67 65 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  age++;.  }else{.
1eb80 20 20 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61      /* Recycle a
1eb90 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
1eba0 77 69 74 68 20 61 20 7a 65 72 6f 20 72 65 66 2d  with a zero ref-
1ebb0 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63  count. */.    rc
1ebc0 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65   = pager_recycle
1ebd0 28 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a  (pPager, &pPg);.
1ebe0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ebf0 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
1ec00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1ec10 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  RR_BLOCKED;.    
1ec20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
1ec30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ec40 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f   goto pager_allo
1ec50 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  cate_out;.    }.
1ec60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ec70 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45  er->state>=SHARE
1ec80 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
1ec90 73 65 72 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20  sert(pPg);.  }. 
1eca0 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70   *ppPg = pPg;..p
1ecb0 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
1ecc0 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
1ecd0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
1ece0 72 65 20 77 65 20 68 61 76 65 20 74 68 65 20 63  re we have the c
1ecf0 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20 70 61 67  ontent for a pag
1ed00 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
1ed10 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  was.** previousl
1ed20 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68 20  y acquired with 
1ed30 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68  noContent==1, th
1ed40 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  en the content w
1ed50 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69  as.** just initi
1ed60 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
1ed70 69 6e 73 74 65 61 64 20 6f 66 20 62 65 69 6e 67  instead of being
1ed80 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e   read from disk.
1ed90 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65 20 6e  .** But now we n
1eda0 65 65 64 20 74 68 65 20 72 65 61 6c 20 64 61 74  eed the real dat
1edb0 61 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20 20  a off of disk.  
1edc0 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 0a  So make sure we.
1edd0 2a 2a 20 68 61 76 65 20 69 74 2e 20 20 52 65 61  ** have it.  Rea
1ede0 64 20 69 74 20 69 6e 20 69 66 20 77 65 20 64 6f  d it in if we do
1edf0 20 6e 6f 74 20 68 61 76 65 20 69 74 20 61 6c 72   not have it alr
1ee00 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eady..*/.static 
1ee10 69 6e 74 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  int pager_get_co
1ee20 6e 74 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67  ntent(PgHdr *pPg
1ee30 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  ){.  if( pPg->ne
1ee40 65 64 52 65 61 64 20 29 7b 0a 20 20 20 20 69 6e  edRead ){.    in
1ee50 74 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67  t rc = readDbPag
1ee60 65 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70  e(pPg->pPager, p
1ee70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  Pg, pPg->pgno);.
1ee80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ee90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1eea0 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30  Pg->needRead = 0
1eeb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1eec0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1eed0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1eee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1eef0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
1ef00 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61  age..**.** A rea
1ef10 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69  d lock on the di
1ef20 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69  sk file is obtai
1ef30 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72  ned when the fir
1ef40 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69  st page is acqui
1ef50 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65  red. .** This re
1ef60 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70  ad lock is dropp
1ef70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ed when the last
1ef80 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
1ef90 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1efa0 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20  utine works for 
1efb0 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20  any page number 
1efc0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20  greater than 0. 
1efd0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1efe0 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c  .** file is smal
1eff0 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
1f000 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65  uested page, the
1f010 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b  n no actual disk
1f020 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20  .** read occurs 
1f030 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  and the memory i
1f040 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  mage of the page
1f050 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1f060 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e  to.** all zeros.
1f070 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61    The extra data
1f080 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
1f090 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
1f0a0 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20  itialized.** to 
1f0b0 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20  zeros the first 
1f0c0 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
1f0d0 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
1f0e0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  y..**.** The acq
1f0f0 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
1f100 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
1f110 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
1f120 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
1f130 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
1f140 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1f150 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
1f160 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
1f170 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
1f180 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
1f190 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
1f1a0 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28  tine and Lookup(
1f1b0 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
1f1c0 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
1f1d0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
1f1e0 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
1f1f0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
1f200 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
1f210 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
1f220 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
1f230 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
1f240 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  eas Lookup().** 
1f250 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
1f260 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
1f270 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
1f280 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
1f290 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
1f2a0 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
1f2b0 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
1f2c0 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
1f2d0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
1f2e0 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28  ** Since Lookup(
1f2f0 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
1f300 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
1f310 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
1f320 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
1f330 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
1f340 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
1f350 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65   false, the page
1f360 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63   contents are ac
1f370 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  tually read from
1f380 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43   disk..** If noC
1f390 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
1f3a0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
1f3b0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
1f3c0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
1f3d0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  ** of the page a
1f3e0 74 20 74 68 69 73 20 74 69 6d 65 2c 20 73 6f 20  t this time, so 
1f3f0 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b  do not do a disk
1f400 20 72 65 61 64 2e 20 20 4a 75 73 74 20 66 69 6c   read.  Just fil
1f410 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  l in the.** page
1f420 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
1f430 72 6f 73 2e 20 20 42 75 74 20 6d 61 72 6b 20 74  ros.  But mark t
1f440 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20  he fact that we 
1f450 68 61 76 65 20 6e 6f 74 20 72 65 61 64 20 74 68  have not read th
1f460 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20  e.** content by 
1f470 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
1f480 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67 2e  r.needRead flag.
1f490 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a    Later on, if .
1f4a0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ** sqlite3PagerW
1f4b0 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
1f4c0 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20 6f 72   on this page or
1f4d0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
1f4e0 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67   is.** called ag
1f4f0 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65  ain with noConte
1f500 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e  nt==0, that mean
1f510 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
1f520 6e 74 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20  nt is needed.** 
1f530 61 6e 64 20 74 68 65 20 64 69 73 6b 20 72 65 61  and the disk rea
1f540 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
1f550 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
1f560 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1f570 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
1f580 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
1f590 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
1f5a0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
1f5b0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
1f5c0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
1f5d0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
1f5e0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
1f5f0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
1f600 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
1f610 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
1f620 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  here */.  int no
1f630 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a  Content       /*
1f640 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72   Do not bother r
1f650 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66  eading content f
1f660 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65  rom disk if true
1f670 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a   */.){.  PgHdr *
1f680 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pPg;.  int rc;..
1f690 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f6a0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
1f6b0 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  NLOCK || pPager-
1f6c0 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d  >nRef>0 || pgno=
1f6d0 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  =1 );..  /* The 
1f6e0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
1f6f0 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
1f700 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1f710 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a  PT if a page.  *
1f720 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
1f730 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a   than this, or z
1f740 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65  ero, is requeste
1f750 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  d..  */.  if( pg
1f760 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
1f770 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20  O || pgno==0 || 
1f780 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
1f790 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
1f7a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f7b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1f7c0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
1f7d0 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68  re we have not h
1f7e0 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20  it any critical 
1f7f0 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20  errors..  */ .  
1f800 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
1f810 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  0 );.  *ppPage =
1f820 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   0;..  /* If thi
1f830 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
1f840 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
1f850 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20  en get a SHARED 
1f860 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
1f870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1f880 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
1f890 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  ) is a no-op if 
1f8a0 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65  .  ** a database
1f8b0 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
1f8c0 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63   held..  */.  rc
1f8d0 20 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f   = pagerSharedLo
1f8e0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
1f8f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f900 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1f910 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1f920 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1f930 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a  AGER_UNLOCK );..
1f940 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
1f950 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
1f960 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30  o);.  if( pPg==0
1f970 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   ){.    /* The r
1f980 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
1f990 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65   not in the page
1f9a0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69   cache. */.    i
1f9b0 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74  nt nMax;.    int
1f9c0 20 68 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e   h;.    PAGER_IN
1f9d0 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
1f9e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
1f9f0 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 50  rAllocatePage(pP
1fa00 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20  ager, &pPg);.   
1fa10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fa20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1fa30 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
1fa40 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
1fa50 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
1fa60 21 4d 45 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e 70  !MEMDB || pgno>p
1fa70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1fa80 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  );.    pPg->inJo
1fa90 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
1faa0 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
1fab0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
1fac0 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65  no);.    pPg->ne
1fad0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
1fae0 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
1faf0 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d  .    pPg->nRef =
1fb00 20 31 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d   1;..    pPager-
1fb10 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28  >nRef++;.    if(
1fb20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e   pPager->nExtra>
1fb30 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
1fb40 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
1fb50 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
1fb60 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
1fb70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  );.    }.    nMa
1fb80 78 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  x = sqlite3Pager
1fb90 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1fba0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1fbb0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
1fbc0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
1fbd0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20  >errCode;.      
1fbe0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1fbf0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65  f(pPg);.      re
1fc00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1fc10 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
1fc20 74 68 65 20 70 61 67 65 20 77 69 74 68 20 64 61  the page with da
1fc30 74 61 2c 20 65 69 74 68 65 72 20 62 79 20 72 65  ta, either by re
1fc40 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64  ading from the d
1fc50 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
1fc60 69 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69  ile, or by setti
1fc70 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  ng the entire pa
1fc80 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20  ge to zero..    
1fc90 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c  */.    if( nMax<
1fca0 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d  (int)pgno || MEM
1fcb0 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74  DB || (noContent
1fcc0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77   && !pPager->alw
1fcd0 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a  aysRollback) ){.
1fce0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
1fcf0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
1fd00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1fd10 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1fd20 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fd30 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
1fd40 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
1fd50 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
1fd60 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
1fd70 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1fd80 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20    pPg->needRead 
1fd90 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21  = noContent && !
1fda0 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
1fdb0 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f  llback;.      IO
1fdc0 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
1fdd0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1fde0 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
1fdf0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
1fe00 64 44 62 50 61 67 65 28 70 50 61 67 65 72 2c 20  dDbPage(pPager, 
1fe10 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg, pgno);.    
1fe20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fe30 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
1fe40 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1fe50 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  AD ){.        pP
1fe60 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20  g->pgno = 0;.   
1fe70 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1fe80 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
1fe90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1fea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1feb0 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b  g->needRead = 0;
1fec0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
1fed0 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74  ink the page int
1fee0 6f 20 74 68 65 20 70 61 67 65 20 68 61 73 68 20  o the page hash 
1fef0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d  table */.    h =
1ff00 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
1ff10 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61  >nHash-1);.    a
1ff20 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
1ff30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
1ff40 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
1ff50 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
1ff60 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
1ff70 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
1ff80 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
1ff90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1ffa0 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
1ffb0 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
1ffc0 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
1ffd0 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
1ffe0 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  Pg;.    }..#ifde
1fff0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
20000 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
20010 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
20020 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
20030 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
20040 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
20050 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
20060 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
20070 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67  .    assert(pPag
20080 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67  er->nRef>0 || pg
20090 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45  no==1);.    PAGE
200a0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
200b0 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e  Hit);.    if( !n
200c0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
200d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74    rc = pager_get
200e0 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
200f0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
20100 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
20110 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20120 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
20130 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  );.  }.  *ppPage
20140 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
20150 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
20160 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
20170 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
20180 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
20190 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
201a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
201b0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
201c0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
201d0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
201e0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
201f0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
20200 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
20210 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
20220 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
20230 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
20240 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
20250 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
20260 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
20270 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
20280 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
20290 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
202a0 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
202b0 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  pgno, ppPage, no
202c0 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 61 67 65  Content);.  page
202d0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
202e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
202f0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
20300 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
20310 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
20320 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
20330 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
20340 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
20350 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
20360 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
20370 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
20380 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
20390 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
203a0 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
203b0 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
203c0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
203d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
203e0 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
203f0 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
20400 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
20410 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
20420 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
20430 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
20440 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
20450 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
20460 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
20470 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
20480 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
20490 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
204a0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
204b0 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
204c0 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
204d0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
204e0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
204f0 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
20500 2a 70 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73  *pPg = 0;..  ass
20510 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
20520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
20530 21 3d 30 20 29 3b 0a 0a 20 20 70 61 67 65 72 45  !=0 );..  pagerE
20540 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
20550 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
20560 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
20570 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
20580 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20  pPager->pAll || 
20590 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
205a0 65 4d 6f 64 65 20 29 3b 0a 20 20 7d 65 6c 73 65  eMode );.  }else
205b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
205c0 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
205d0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
205e0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 44  FULL ){.    /* D
205f0 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d  o nothing */.  }
20600 65 6c 73 65 20 69 66 28 20 28 70 50 67 20 3d 20  else if( (pPg = 
20610 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
20620 67 65 72 2c 20 70 67 6e 6f 29 29 21 3d 30 20 29  ger, pgno))!=0 )
20630 7b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70  {.    page_ref(p
20640 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
20650 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
20660 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
20670 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
20680 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  page..**.** If t
20690 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
206a0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
206b0 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
206c0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
206d0 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
206e0 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
206f0 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
20700 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
20710 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
20720 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
20730 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
20740 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
20750 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
20760 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20770 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
20780 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
20790 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 67  ager;..  if( pPg
207a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
207b0 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
207c0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
207d0 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
207e0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
207f0 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
20800 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
20810 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
20820 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 67    pagerEnter(pPg
20830 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67  ->pPager);.  pPg
20840 2d 3e 6e 52 65 66 2d 2d 3b 0a 0a 20 20 43 48 45  ->nRef--;..  CHE
20850 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
20860 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
20870 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
20880 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63  s to a page reac
20890 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20  h 0, call the.  
208a0 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e  ** destructor an
208b0 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74  d add the page t
208c0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
208d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
208e0 6e 52 65 66 3d 3d 30 20 29 7b 0a 0a 20 20 20 20  nRef==0 ){..    
208f0 6c 72 75 4c 69 73 74 41 64 64 28 70 50 67 29 3b  lruListAdd(pPg);
20900 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
20910 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  >xDestructor ){.
20920 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
20930 65 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70  estructor(pPg, p
20940 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
20950 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
20960 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  * When all pages
20970 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c   reach the freel
20980 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65  ist, drop the re
20990 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20  ad lock from.   
209a0 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
209b0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
209c0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
209d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
209e0 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b  ager->nRef>=0 );
209f0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
20a00 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50  >nRef==0 && (!pP
20a10 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
20a20 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  ode || pPager->j
20a30 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a  ournalOff>0) ){.
20a40 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63        pagerUnloc
20a50 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
20a60 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
20a70 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
20a80 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
20a90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20aa0 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72  ** Create a jour
20ab0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61  nal file for pPa
20ac0 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75  ger.  There shou
20ad0 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  ld already be a 
20ae0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45  RESERVED.** or E
20af0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
20b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20b10 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
20b20 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
20b30 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
20b40 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
20b50 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e  hing.  Return an
20b60 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
20b70 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77  release the.** w
20b80 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79  rite lock if any
20b90 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
20ba0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20bb0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
20bc0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
20bd0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
20be0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
20bf0 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61  >pVfs;.  int fla
20c00 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
20c10 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
20c20 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
20c30 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
20c40 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63  EATE);..  int rc
20c50 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
20c60 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
20c70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
20c80 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
20c90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20ca0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
20cb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20cc0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
20cd0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
20ce0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
20cf0 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  er);.  pagerLeav
20d00 65 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  e(pPager);.  pPa
20d10 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
20d20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
20d30 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
20d40 53 69 7a 65 29 3b 0a 20 20 70 61 67 65 72 45 6e  Size);.  pagerEn
20d50 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
20d60 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
20d70 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
20d80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
20d90 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  M;.    goto fail
20da0 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
20db0 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  al;.  }..  if( p
20dc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
20dd0 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  en==0 ){.    if(
20de0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
20df0 65 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73  e ){.      flags
20e00 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e   |= (SQLITE_OPEN
20e10 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
20e20 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
20e30 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 65  JOURNAL);.    }e
20e40 6c 73 65 7b 0a 20 20 20 20 20 20 66 6c 61 67 73  lse{.      flags
20e50 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e   |= (SQLITE_OPEN
20e60 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
20e70 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
20e80 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
20e90 43 5f 57 52 49 54 45 0a 20 20 20 20 72 63 20 3d  C_WRITE.    rc =
20ea0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
20eb0 70 65 6e 28 0a 20 20 20 20 20 20 20 20 70 56 66  pen(.        pVf
20ec0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
20ed0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
20ee0 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66  , flags, jrnlBuf
20ef0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a  ferSize(pPager).
20f00 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20      );.#else.   
20f10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
20f20 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
20f30 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
20f40 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
20f50 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61  0);.#endif.    a
20f60 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
20f70 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
20f80 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b  jfd->pMethods );
20f90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
20fa0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
20fb0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
20fc0 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  er = 0;.    pPag
20fd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
20fe0 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   0;.    if( rc!=
20ff0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21000 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21010 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
21020 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
21030 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
21040 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
21050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
21060 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
21070 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 7d 0a  _journal;.    }.
21080 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
21090 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
210a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
210b0 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70  Started = 0;.  p
210c0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
210d0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  = 0;.  pPager->a
210e0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
210f0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
21100 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  c = 0;.  if( pPa
21110 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
21120 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
21130 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f  >errCode;.    go
21140 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
21150 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
21160 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
21170 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
21180 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72  Size;..  rc = wr
21190 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
211a0 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50  ager);..  if( pP
211b0 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
211c0 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  en && rc==SQLITE
211d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
211e0 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
211f0 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20  Begin(pPager);. 
21200 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
21210 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
21220 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 72 63  LITE_NOMEM && rc
21230 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  !=SQLITE_IOERR_N
21240 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d  OMEM ){.    rc =
21250 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
21260 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
21270 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
21290 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
212a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
212b0 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f  urn rc;..failed_
212c0 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a  to_open_journal:
212d0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
212e0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
212f0 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
21300 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
21310 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  l = 0;.  return 
21320 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
21330 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
21340 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
21350 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
21360 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20  removed when.** 
21370 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66  the any of the f
21380 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a  ollowing happen:
21390 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  .**.**   *  sqli
213a0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
213b0 61 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c  aseTwo() is call
213c0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
213d0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
213e0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
213f0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
21400 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  erClose() is cal
21410 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
21420 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
21430 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e   is called to on
21440 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69   every outstandi
21450 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ng page..**.** T
21460 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
21470 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  er to this routi
21480 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ne is a pointer 
21490 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65  to any open page
214a0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
214b0 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69  ase file.  Nothi
214c0 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74  ng changes about
214d0 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69   the page - it i
214e0 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f  s used merely to
214f0 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f  .** acquire a po
21500 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
21510 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
21520 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74   as proof that t
21530 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61  here is.** alrea
21540 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  dy a read-lock o
21550 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
21560 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
21570 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
21580 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70  ates how much sp
21590 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20  ace in bytes to 
215a0 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a  reserve for a.**
215b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
215c0 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65  file-name at the
215d0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
215e0 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73  urnal when it is
215f0 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
21600 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  A journal file i
21610 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73  s opened if this
21620 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
21630 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74  ary file.  For t
21640 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
21650 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f  s, the opening o
21660 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
21670 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
21680 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
21690 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20  .** actual need 
216a0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
216b0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
216c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
216d0 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76  s already reserv
216e0 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20  ed for writing, 
216f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
21700 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
21710 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
21720 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67  , go ahead and g
21730 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
21740 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
21750 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
21760 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69  instead of waiti
21770 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20  ng until we try 
21780 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  to flush the cac
21790 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c  he.  The.** exFl
217a0 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  ag is ignored if
217b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
217c0 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
217d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
217e0 50 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67  PagerBegin(DbPag
217f0 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c  e *pPg, int exFl
21800 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  ag){.  Pager *pP
21810 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
21820 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
21830 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67 65  QLITE_OK;.  page
21840 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
21850 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
21860 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
21870 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
21880 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
21890 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
218a0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
218b0 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
218c0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
218d0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
218e0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
218f0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
21900 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
21910 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
21920 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
21930 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
21940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21950 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
21960 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
21970 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
21980 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
21990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
219a0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
219b0 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
219c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
219d0 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
219e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
219f0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
21a00 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
21a10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
21a20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
21a30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21a40 20 20 20 20 20 20 20 20 70 61 67 65 72 4c 65 61          pagerLea
21a50 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
21a60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
21a80 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
21a90 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52  = 0;.      PAGER
21aa0 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54  TRACE2("TRANSACT
21ab0 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
21ac0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
21ad0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
21ae0 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
21af0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20  ager->tempFile. 
21b00 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
21b10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
21b20 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
21b30 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
21b40 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
21b50 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
21b60 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
21b70 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
21b80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21b90 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  pen && pPager->j
21ba0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
21bb0 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
21bc0 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  ens when the pag
21bd0 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73  er was in exclus
21be0 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
21bf0 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65  last.    ** time
21c00 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74   a (read or writ
21c10 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  e) transaction w
21c20 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
21c30 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a  concluded.    **
21c40 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   by this connect
21c50 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ion. Instead of 
21c60 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75  deleting the jou
21c70 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73  rnal file it was
21c80 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70   .    ** kept op
21c90 65 6e 20 61 6e 64 20 74 72 75 6e 63 61 74 65 64  en and truncated
21ca0 20 74 6f 20 30 20 62 79 74 65 73 2e 0a 20 20 20   to 0 bytes..   
21cb0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
21cc0 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20  pPager->nRec==0 
21cd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21ce0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
21cf0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
21d00 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
21d10 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
21d20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
21d30 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
21d40 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
21d50 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
21d60 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
21d70 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
21d80 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e 64 62  eate( pPager->db
21d90 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 61 67 65  Size );.    page
21da0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
21db0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
21dc0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  >pInJournal ){. 
21dd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21de0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
21df0 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
21e00 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
21e10 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
21e20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
21e30 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
21e40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
21e50 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6a  sert( !pPager->j
21e60 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50  ournalOpen || pP
21e70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21e80 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  >0 || rc!=SQLITE
21e90 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 4c 65  _OK );.  pagerLe
21ea0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
21eb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21ec0 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64  ** Make a page d
21ed0 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64  irty.  Set its d
21ee0 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64  irty flag and ad
21ef0 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74  d it to the dirt
21f00 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a  y.** page list..
21f10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
21f20 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a  akeDirty(PgHdr *
21f30 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
21f40 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20  >dirty==0 ){.   
21f50 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
21f60 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
21f70 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
21f80 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
21f90 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72  y = pPager->pDir
21fa0 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ty;.    if( pPag
21fb0 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20  er->pDirty ){.  
21fc0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
21fd0 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  ty->pPrevDirty =
21fe0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
21ff0 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20  pPg->pPrevDirty 
22000 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
22010 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  >pDirty = pPg;. 
22020 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
22030 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20   a page clean.  
22040 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20  Clear its dirty 
22050 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  bit and remove i
22060 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69  t from the.** di
22070 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  rty page list..*
22080 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
22090 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70  keClean(PgHdr *p
220a0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
220b0 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67  dirty ){.    pPg
220c0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
220d0 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79   if( pPg->pDirty
220e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
220f0 28 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70  ( pPg->pDirty->p
22100 50 72 65 76 44 69 72 74 79 3d 3d 70 50 67 20 29  PrevDirty==pPg )
22110 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69  ;.      pPg->pDi
22120 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
22130 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  = pPg->pPrevDirt
22140 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  y;.    }.    if(
22150 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
22160 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
22170 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  ( pPg->pPrevDirt
22180 79 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67 20 29  y->pDirty==pPg )
22190 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  ;.      pPg->pPr
221a0 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20  evDirty->pDirty 
221b0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
221c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
221d0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
221e0 67 65 72 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67  ger->pDirty==pPg
221f0 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
22200 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
22210 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  pPg->pDirty;.   
22220 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
22230 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
22240 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
22250 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
22260 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
22270 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20  urnal .** if it 
22280 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
22290 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74  eady.  This rout
222a0 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
222b0 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ed before making
222c0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61  .** changes to a
222d0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
222e0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
222f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
22300 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72  ed, the pager cr
22310 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a  eates a new.** j
22320 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69  ournal and acqui
22330 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  res a RESERVED l
22340 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
22350 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45 53  ase.  If the RES
22360 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  ERVED.** lock co
22370 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69  uld not be acqui
22380 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  red, this routin
22390 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
223a0 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63  _BUSY.  The.** c
223b0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d  alling routine m
223c0 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68  ust check for th
223d0 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  at return value 
223e0 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
223f0 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20  ot to.** change 
22400 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
22410 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  til this routine
22420 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
22430 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
22440 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
22450 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74  uld not be writt
22460 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64  en because the d
22470 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20  isk is full,.** 
22480 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
22490 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
224a0 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61  _FULL and does a
224b0 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c  n immediate roll
224c0 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62  back..** All sub
224d0 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74  sequent write at
224e0 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75  tempts also retu
224f0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75  rn SQLITE_FULL u
22500 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73  ntil there.** is
22510 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
22520 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20  e3PagerCommit() 
22530 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  or sqlite3PagerR
22540 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20  ollback() to.** 
22550 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  reset..*/.static
22560 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
22570 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
22580 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 50 47  void *pData = PG
22590 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
225a0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
225b0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
225c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
225d0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65  TE_OK;..  /* Che
225e0 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20  ck for errors.  
225f0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
22600 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20  >errCode ){ .   
22610 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
22620 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
22630 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
22640 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nly ){.    retur
22650 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
22660 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70   }..  assert( !p
22670 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
22680 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47   );..  CHECK_PAG
22690 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66  E(pPg);..  /* If
226a0 20 74 68 69 73 20 70 61 67 65 20 77 61 73 20 70   this page was p
226b0 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72  reviously acquir
226c0 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e  ed with noConten
226d0 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61 6e 73  t==1, that means
226e0 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e 27 74 20  .  ** we didn't 
226f0 72 65 61 6c 6c 79 20 72 65 61 64 20 69 6e 20 74  really read in t
22700 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
22710 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 63 61  e page.  This ca
22720 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66  n happen.  ** (f
22730 6f 72 20 65 78 61 6d 70 6c 65 29 20 77 68 65 6e  or example) when
22740 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
22750 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  ng moved to the 
22760 66 72 65 65 6c 69 73 74 2e 20 20 42 75 74 0a 20  freelist.  But. 
22770 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65 20 28   ** now we are (
22780 70 65 72 68 61 70 73 29 20 6d 6f 76 69 6e 67 20  perhaps) moving 
22790 74 68 65 20 70 61 67 65 20 6f 66 66 20 6f 66 20  the page off of 
227a0 74 68 65 20 66 72 65 65 6c 69 73 74 20 66 6f 72  the freelist for
227b0 0a 20 20 2a 2a 20 72 65 75 73 65 20 61 6e 64 20  .  ** reuse and 
227c0 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  we need to know 
227d0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  its original con
227e0 74 65 6e 74 20 73 6f 20 74 68 61 74 20 63 6f 6e  tent so that con
227f0 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65  tent.  ** can be
22800 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72   stored in the r
22810 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
22820 20 20 53 6f 20 64 6f 20 74 68 65 20 72 65 61 64    So do the read
22830 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 74 69   at this.  ** ti
22840 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  me..  */.  rc = 
22850 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
22860 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63  t(pPg);.  if( rc
22870 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
22880 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72  c;.  }..  /* Mar
22890 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
228a0 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
228b0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
228c0 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
228d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
228e0 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
228f0 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
22900 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  */.  makeDirty(p
22910 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg);.  if( pPg->
22920 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 61  inJournal && (pa
22930 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50  geInStatement(pP
22940 67 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  g) || pPager->st
22950 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20  mtInUse==0) ){. 
22960 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
22970 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  Cache = 1;.  }el
22980 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  se{..    /* If w
22990 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
229a0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
229b0 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
229c0 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  be.    ** writte
229d0 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
229e0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
229f0 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
22a00 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72  ournal.    ** or
22a10 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20   both..    **.  
22a20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b    ** First check
22a30 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65   to see that the
22a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
22a50 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a  rnal exists and.
22a60 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74      ** create it
22a70 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
22a80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
22a90 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
22aa0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
22ab0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
22ac0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50  te3PagerBegin(pP
22ad0 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  g, 0);.    if( r
22ae0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22af0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
22b00 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
22b10 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
22b20 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
22b30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61   );.    if( !pPa
22b40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
22b50 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
22b60 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20  ournal.         
22b70 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
22b80 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
22b90 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
22ba0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
22bb0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
22bc0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
22bd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22be0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
22bf0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
22c00 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
22c10 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
22c20 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
22c30 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
22c40 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
22c50 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
22c60 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
22c70 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
22c80 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
22c90 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
22ca0 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
22cb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
22cc0 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
22cd0 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
22ce0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
22cf0 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
22d00 26 26 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  && (pPager->jour
22d10 6e 61 6c 4f 70 65 6e 20 7c 7c 20 4d 45 4d 44 42  nalOpen || MEMDB
22d20 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ) ){.      if( (
22d30 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
22d40 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
22d50 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
22d60 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
22d70 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
22d80 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
22d90 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
22da0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50  er);.          P
22db0 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52  AGERTRACE3("JOUR
22dc0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
22dd0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
22de0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
22df0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
22e00 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d  ( pHist->pOrig==
22e10 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
22e20 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
22e30 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50  lite3_malloc( pP
22e40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
22e50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22e60 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b  !pHist->pOrig ){
22e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
22e80 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
22e90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22ea0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
22eb0 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48  Hist->pOrig, PGH
22ec0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
22ed0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
22ee0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
22ef0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  e{.          u32
22f00 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20   cksum;.        
22f10 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
22f20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
22f30 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
22f40 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
22f50 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
22f60 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
22f70 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
22f80 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
22f90 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
22fa0 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
22fb0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
22fc0 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
22fd0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
22fe0 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
22ff0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
23000 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
23010 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
23020 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
23030 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
23040 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70         cksum = p
23050 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
23060 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
23070 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23080 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
23090 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
230a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67  >journalOff, pPg
230b0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
230c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
230d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
230e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
230f0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
23100 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
23110 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
23140 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
23150 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20  f + 4);.        
23160 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
23170 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72  nalOff += pPager
23180 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20  ->pageSize+4;.  
23190 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
231a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
231b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
231c0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
231d0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
231e0 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
231f0 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20  alOff, cksum);. 
23200 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
23210 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
23220 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
23230 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
23240 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
23250 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
23260 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23280 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
23290 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  lOff, pPager->pa
232a0 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20  geSize));.      
232b0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
232c0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
232d0 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  tej_count);.    
232e0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
232f0 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  5("JOURNAL %d pa
23300 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
23310 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
23320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23330 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
23340 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
23350 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61 67 65 72  >needSync, pager
23360 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b  _pagehash(pPg));
23370 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ..          /* A
23380 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
23390 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74  red writing to t
233a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
233b0 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   The .          
233c0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
233d0 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
233e0 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20  ck by the layer 
233f0 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20  above..         
23400 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
23410 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
23430 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
23440 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
23450 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
23460 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
23470 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
23480 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
23490 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
234a0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
234b0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
234c0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
234d0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
234e0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
234f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23500 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
23510 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
23520 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
23530 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  t(pPager->pInStm
23540 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
23550 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23560 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
23570 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e  {.        pPg->n
23580 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
23590 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
235a0 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
235b0 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41  Sync;.        PA
235c0 47 45 52 54 52 41 43 45 34 28 22 41 50 50 45 4e  GERTRACE4("APPEN
235d0 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
235e0 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
23600 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
23610 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
23620 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d  edSync);.      }
23630 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
23640 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
23650 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
23660 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
23670 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  }.      pPg->inJ
23680 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
23690 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
236a0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
236b0 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
236c0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
236d0 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
236e0 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
236f0 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
23700 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
23710 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
23720 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
23730 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
23740 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
23750 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
23760 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
23770 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
23780 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
23790 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
237a0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
237b0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
237c0 55 73 65 20 0a 20 20 20 20 20 26 26 20 21 70 61  Use .     && !pa
237d0 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50  geInStatement(pP
237e0 67 29 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74  g) .     && (int
237f0 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
23800 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20  er->stmtSize .  
23810 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
23820 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
23830 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
23840 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
23850 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  DbSize );.      
23860 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
23870 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
23880 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
23890 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
238a0 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
238b0 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  rt( pHist->pStmt
238c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
238d0 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71  Hist->pStmt = sq
238e0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50  lite3_malloc( pP
238f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
23900 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
23910 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
23920 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
23930 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48  Hist->pStmt, PGH
23940 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
23950 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
23960 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
23970 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
23980 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
23990 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
239a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
239b0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
239c0 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
239d0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
239e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
239f0 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
23a00 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
23a10 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
23a20 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
23a30 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20   char *pData2 = 
23a40 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
23a50 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
23a60 20 37 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   7);.        rc 
23a70 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
23a80 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66 73  ager->stfd, offs
23a90 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
23aa0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
23ab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23ac0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23ad0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
23ae0 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c  r->stfd, pData2,
23af0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
23b00 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20  e, offset+4);.  
23b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23b20 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d  PAGERTRACE3("STM
23b30 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
23b40 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
23b50 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
23b60 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
23b70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
23b90 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
23ba0 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
23bb0 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20  ->stmtNRec++;.  
23bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
23bd0 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 21 3d 30  ager->pInStmt!=0
23be0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
23bf0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
23c00 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50  ger->pInStmt, pP
23c10 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
23c20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
23c30 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
23c40 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
23c50 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  eturn..  */.  as
23c60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
23c70 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
23c80 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
23c90 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70  r->dbSize<(int)p
23ca0 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
23cb0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
23cc0 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
23cd0 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50  if( !MEMDB && pP
23ce0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45  ager->dbSize==PE
23cf0 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
23d00 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
23d10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
23d20 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ize++;.    }.  }
23d30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23d40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
23d50 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
23d60 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65  mark a data-page
23d70 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74   as writable. It
23d80 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f   uses .** pager_
23d90 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20  write() to open 
23da0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  a journal file (
23db0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
23dc0 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e  eady open).** an
23dd0 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67 65  d write the page
23de0 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a   *pData to the j
23df0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
23e00 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
23e10 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
23e20 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69  on and pager_wri
23e30 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  te() is that thi
23e40 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
23e50 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  so deals with th
23e60 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  e special case w
23e70 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70  here 2 or more p
23e80 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61  ages.** fit on a
23e90 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
23ea0 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
23eb0 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e  e all co-residen
23ec0 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20  t pages.** must 
23ed0 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
23ee0 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
23ef0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74   file before ret
23f00 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
23f10 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
23f20 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
23f30 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
23f40 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64  LITE_OK;..  PgHd
23f50 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
23f60 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
23f70 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
23f80 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72  .  Pgno nPagePer
23f90 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72  Sector = (pPager
23fa0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61  ->sectorSize/pPa
23fb0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
23fc0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
23fd0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45  ager);.  if( !ME
23fe0 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65 72 53  MDB && nPagePerS
23ff0 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50  ector>1 ){.    P
24000 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
24010 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
24020 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
24030 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
24040 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70  le */.    Pgno p
24050 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  g1;             
24060 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
24070 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
24080 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
24090 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  n. */.    int nP
240a0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
240b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
240c0 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20   pages starting 
240d0 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61  at pg1 to journa
240e0 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  l */.    int ii;
240f0 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
24100 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  c = 0;..    /* S
24110 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
24120 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
24130 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
24140 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f  annot allow a jo
24150 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61  urnal.    ** hea
24160 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
24170 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
24180 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
24190 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
241a0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
241b0 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
241c0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Sync==0 );.    p
241d0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
241e0 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   = 1;..    /* Th
241f0 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73  is trick assumes
24200 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70   that both the p
24210 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
24220 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20  tor-size are.   
24230 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70   ** an integer p
24240 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65  ower of 2. It se
24250 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20  ts variable pg1 
24260 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  to the identifie
24270 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  r.    ** of the 
24280 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
24290 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
242a0 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20  located on..    
242b0 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70  */.    pg1 = ((p
242c0 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28  Pg->pgno-1) & ~(
242d0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
242e0 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61  )) + 1;..    nPa
242f0 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65  geCount = sqlite
24300 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
24310 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
24320 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
24330 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
24340 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
24350 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
24360 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
24370 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
24380 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
24390 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
243a0 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
243b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
243c0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
243d0 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
243e0 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
243f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
24400 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
24410 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
24420 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
24430 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
24440 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
24450 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
24460 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
24470 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
24480 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
24490 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67       if( pg==pPg
244a0 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74  ->pgno || !sqlit
244b0 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
244c0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
244d0 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pg) ){.        
244e0 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
244f0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
24500 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
24510 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
24520 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
24530 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
24540 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24560 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
24570 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
24580 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
24590 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
245a0 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
245b0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
245c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
245d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
245e0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
245f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24600 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
24610 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72  ( (pPage = pager
24620 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
24630 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  pg))!=0 ){.     
24640 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65     if( pPage->ne
24650 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
24660 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
24670 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24680 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
24690 2a 20 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e  * If the PgHdr.n
246a0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
246b0 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74  set for any of t
246c0 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a  he nPage pages .
246d0 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
246e0 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20  at pg1, then it 
246f0 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20  needs to be set 
24700 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e  for all of them.
24710 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   Because.    ** 
24720 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f  writing to any o
24730 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61  f these nPage pa
24740 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74  ges may damage t
24750 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20  he others, the. 
24760 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
24770 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  le must contain 
24780 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20  sync()ed copies 
24790 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20  of all of them. 
247a0 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79     ** before any
247b0 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20   of them can be 
247c0 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
247d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
247e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
247f0 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
24800 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
24810 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53 79 6e  nPage && needSyn
24820 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
24830 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d    PgHdr *pPage =
24840 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
24850 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20  ager, pg1+ii);. 
24860 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
24870 20 29 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79   ) pPage->needSy
24880 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
24890 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
248a0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  ger->needSync);.
248b0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
248c0 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
248d0 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Sync==1 );.    p
248e0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
248f0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
24900 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
24910 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
24920 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
24930 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
24940 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
24950 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
24960 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
24970 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
24980 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
24990 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
249a0 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
249b0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
249c0 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
249d0 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
249e0 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
249f0 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
24a00 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
24a10 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
24a20 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
24a30 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
24a40 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23   pPg->dirty;.}.#
24a50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
24a60 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
24a70 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
24a80 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
24a90 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
24aa0 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
24ab0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
24ac0 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
24ad0 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
24ae0 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
24af0 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
24b00 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
24b10 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
24b20 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
24b30 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
24b40 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
24b50 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
24b60 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
24b70 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
24b80 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
24b90 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
24ba0 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
24bb0 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
24bc0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
24bd0 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
24be0 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
24bf0 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
24c00 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  * sqlite3PagerDo
24c10 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  ntRollback() bel
24c20 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
24c30 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
24c40 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
24c50 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
24c60 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
24c70 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
24c80 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
24c90 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
24ca0 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
24cb0 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
24cc0 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
24cd0 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
24ce0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
24cf0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
24d00 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61   for the same pa
24d10 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65  ge.** will there
24d20 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64  after be ignored
24d30 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
24d40 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20  sary to avoid a 
24d50 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65  problem.** where
24d60 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
24d70 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  a is added to th
24d80 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
24d90 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a  g one part of.**
24da0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
24db0 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
24dc0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
24dd0 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72  ring a later par
24de0 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  t.** of the same
24df0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
24e00 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
24e10 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20   other purpose. 
24e20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66   When it.** is f
24e30 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
24e40 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
24e50 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
24e60 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64  ed.  When reused
24e70 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  ,.** the sqlite3
24e80 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
24e90 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
24ea0 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61  alled.  But beca
24eb0 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  use the.** page 
24ec0 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61  contains critica
24ed0 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c  l data, we still
24ee0 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65   need to be sure
24ef0 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c   it gets.** roll
24f00 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
24f10 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50   of the sqlite3P
24f20 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
24f30 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64  () call..*/.void
24f40 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
24f50 74 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  tWrite(DbPage *p
24f60 44 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72  DbPage){.  PgHdr
24f70 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b   *pPg = pDbPage;
24f80 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
24f90 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
24fa0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72  .  if( MEMDB ) r
24fb0 65 74 75 72 6e 3b 0a 20 20 70 61 67 65 72 45 6e  eturn;.  pagerEn
24fc0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ter(pPager);.  p
24fd0 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
24fe0 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ck = 1;.  if( pP
24ff0 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61  g->dirty && !pPa
25000 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
25010 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
25020 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
25030 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
25040 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
25050 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70  ize==(int)pPg->p
25060 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f  gno && pPager->o
25070 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72  rigDbSize<pPager
25080 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
25090 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
250a0 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  es is the last p
250b0 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
250c0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73  and the file has
250d0 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20   grown.      ** 
250e0 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  during the curre
250f0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
25100 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b  then do NOT mark
25110 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
25120 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65  an..      ** Whe
25130 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
25140 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75  ile grows, we mu
25150 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  st make sure tha
25160 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a  t the last page.
25170 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72        ** gets wr
25180 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f  itten at least o
25190 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  nce so that the 
251a0 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62  disk file will b
251b0 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20  e the correct.  
251c0 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20      ** size. If 
251d0 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  you do not write
251e0 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74   this page and t
251f0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
25200 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ile.      ** on 
25210 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70  the disk ends up
25220 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c   being too small
25230 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20  , that can lead 
25240 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  to database.    
25250 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20    ** corruption 
25260 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20  during the next 
25270 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
25280 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
25290 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
252a0 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E3("DONT_WRITE p
252b0 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
252c0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
252d0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
252e0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
252f0 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
25300 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
25310 29 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  ).      makeClea
25320 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53  n(pPg);.#ifdef S
25330 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
25340 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
25350 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
25360 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
25370 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  dif.    }.  }.  
25380 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
25390 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  r);.}../*.** A c
253a0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
253b0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
253c0 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
253d0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
253e0 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
253f0 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
25400 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
25410 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
25420 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
25430 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
25440 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
25450 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
25460 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
25470 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
25480 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e  .** If we have n
25490 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79 20  ot yet actually 
254a0 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
254b0 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 28 69   of this page (i
254c0 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e 6e  f.** the PgHdr.n
254d0 65 65 64 52 65 61 64 20 66 6c 61 67 20 69 73 20  eedRead flag is 
254e0 73 65 74 29 20 74 68 65 6e 20 74 68 69 73 20 72  set) then this r
254f0 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20 61  outine acts as a
25500 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61 74   promise.** that
25510 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 6e   we will never n
25520 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 20  eed to read the 
25530 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20  page content in 
25540 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20 73  the future..** s
25550 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64 20 66  o the needRead f
25560 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61 72  lag can be clear
25570 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
25580 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
25590 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
255a0 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ck(DbPage *pPg){
255b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
255c0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
255d0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
255e0 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
255f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
25600 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
25610 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a  ;..  /* If the j
25620 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
25630 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e 74  ot open, or Dont
25640 57 72 69 74 65 28 29 20 68 61 73 20 62 65 65 6e  Write() has been
25650 20 63 61 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20   called on.  ** 
25660 74 68 69 73 20 70 61 67 65 20 28 44 6f 6e 74 57  this page (DontW
25670 72 69 74 65 28 29 20 73 65 74 73 20 74 68 65 20  rite() sets the 
25680 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
25690 6c 61 67 29 2c 20 74 68 65 6e 20 74 68 69 73 0a  lag), then this.
256a0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73    ** function is
256b0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
256c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
256d0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 70  rnalOpen==0 || p
256e0 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
256f0 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c  ck || pPager->al
25700 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  waysRollback ){.
25710 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
25720 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
25730 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
25740 28 20 21 4d 45 4d 44 42 20 29 3b 20 20 20 20 2f  ( !MEMDB );    /
25750 2a 20 46 6f 72 20 61 20 6d 65 6d 64 62 2c 20 70  * For a memdb, p
25760 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
25770 65 6e 20 69 73 20 61 6c 77 61 79 73 20 30 20 2a  en is always 0 *
25780 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
25790 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
257a0 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
257b0 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
257c0 3e 70 67 6e 6f 20 3e 20 70 50 61 67 65 72 2d 3e  >pgno > pPager->
257d0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
257e0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
257f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53 45  ndif..  /* If SE
25800 43 55 52 45 5f 44 45 4c 45 54 45 20 69 73 20 64  CURE_DELETE is d
25810 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
25820 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 68  ere is no way th
25830 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 72 6f 75  at this.  ** rou
25840 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c  tine can be call
25850 65 64 20 6f 6e 20 61 20 70 61 67 65 20 66 6f 72  ed on a page for
25860 20 77 68 69 63 68 20 73 71 6c 69 74 65 33 50 61   which sqlite3Pa
25870 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 0a 20  gerDontWrite(). 
25880 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
25890 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
258a0 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 73 61  ed during the sa
258b0 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  me transaction..
258c0 20 20 2a 2a 20 41 6e 64 20 69 66 20 44 6f 6e 74    ** And if Dont
258d0 57 72 69 74 65 28 29 20 68 61 73 20 70 72 65 76  Write() has prev
258e0 69 6f 75 73 6c 79 20 62 65 65 6e 20 63 61 6c 6c  iously been call
258f0 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ed, the followin
25900 67 0a 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  g.  ** condition
25910 73 20 6d 75 73 74 20 62 65 20 6d 65 74 2e 0a 20  s must be met.. 
25920 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
25930 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
25940 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
25950 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
25960 62 53 69 7a 65 20 29 3b 0a 0a 20 20 61 73 73 65  bSize );..  asse
25970 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
25980 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 73  ournal!=0 );.  s
25990 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
259a0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
259b0 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
259c0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
259d0 20 3d 20 31 3b 0a 20 20 70 50 67 2d 3e 6e 65 65   = 1;.  pPg->nee
259e0 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 69 66 28  dRead = 0;.  if(
259f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
25a00 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  se ){.    assert
25a10 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  ( pPager->stmtSi
25a20 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 6f 72  ze >= pPager->or
25a30 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
25a40 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
25a50 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
25a60 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
25a70 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28  }.  PAGERTRACE3(
25a80 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70  "DONT_ROLLBACK p
25a90 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
25aa0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
25ab0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
25ac0 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41 47  IOTRACE(("GARBAG
25ad0 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  E %p %d\n", pPag
25ae0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
25af0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
25b00 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ger);.}.../*.** 
25b10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
25b20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
25b30 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  ent the database
25b40 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
25b50 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20  nter,.** stored 
25b60 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68  at byte 24 of th
25b70 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f  e pager file..*/
25b80 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
25b90 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
25ba0 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
25bb0 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74  er, int isDirect
25bc0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48  ){.  PgHdr *pPgH
25bd0 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  dr;.  u32 change
25be0 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20  _counter;.  int 
25bf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25c00 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
25c10 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
25c20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70  ){.    /* Open p
25c30 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
25c40 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
25c50 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
25c60 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
25c70 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a  r, 1, &pPgHdr);.
25c80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25c90 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
25ca0 63 3b 0a 0a 20 20 20 20 69 66 28 20 21 69 73 44  c;..    if( !isD
25cb0 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20 72  irect ){.      r
25cc0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25cd0 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20  Write(pPgHdr);. 
25ce0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
25cf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25d00 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
25d10 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20  ref(pPgHdr);.   
25d20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
25d30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
25d40 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
25d50 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
25d60 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
25d70 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
25d80 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f  . */.    change_
25d90 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
25da0 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
25db0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
25dc0 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f 63  s);.    change_c
25dd0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75  ounter++;.    pu
25de0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
25df0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
25e00 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67  gHdr))+24, chang
25e10 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  e_counter);..   
25e20 20 69 66 28 20 69 73 44 69 72 65 63 74 20 26 26   if( isDirect &&
25e30 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
25e40 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 63  thods ){.      c
25e50 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20  onst void *zBuf 
25e60 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
25e70 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 72  pPgHdr);.      r
25e80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
25e90 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  te(pPager->fd, z
25ea0 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
25eb0 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d  eSize, 0);.    }
25ec0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
25ed0 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
25ee0 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
25ef0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
25f00 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65  gHdr);.    pPage
25f10 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
25f20 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ne = 1;.  }.  re
25f30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25f40 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72  * Sync the pager
25f50 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 0a 2a   file to disk..*
25f60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
25f70 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50  erSync(Pager *pP
25f80 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
25f90 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
25fa0 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ager);.  rc = sq
25fb0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
25fc0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
25fd0 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 70  sync_flags);.  p
25fe0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
25ff0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
26000 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
26010 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26020 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
26030 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
26040 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
26050 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
26060 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
26070 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
26080 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
26090 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
260a0 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
260b0 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
260c0 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
260d0 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
260e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
260f0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
26100 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
26110 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
26120 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
26130 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
26140 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  d, all dirty pag
26150 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  es written.** to
26160 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26170 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  le and the datab
26180 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
26190 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
261a0 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20  that.** remains 
261b0 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
261c0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20  ansaction is to 
261d0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
261e0 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d  al file (or.** m
261f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
26200 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
26210 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
26220 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
26230 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
26240 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
26250 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
26260 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
26270 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
26280 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
26290 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
262a0 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e  er nTrunc is non
262b0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
262c0 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72  pager file is tr
262d0 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54  uncated to.** nT
262e0 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73  runc pages (this
262f0 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f   is used by auto
26300 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
26310 73 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  s)..**.** If the
26320 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
26330 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74   - noSync - is t
26340 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
26350 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
26360 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e  lf.** is not syn
26370 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ced. The caller 
26380 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65  must call sqlite
26390 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72  3PagerSync() dir
263a0 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63  ectly to.** sync
263b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
263c0 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
263d0 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  g CommitPhaseTwo
263e0 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  () to delete the
263f0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
26400 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
26410 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
26420 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
26430 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
26440 72 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r, .  const char
26450 20 2a 7a 4d 61 73 74 65 72 2c 20 0a 20 20 50 67   *zMaster, .  Pg
26460 6e 6f 20 6e 54 72 75 6e 63 2c 0a 20 20 69 6e 74  no nTrunc,.  int
26470 20 6e 6f 53 79 6e 63 0a 29 7b 0a 20 20 69 6e 74   noSync.){.  int
26480 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26490 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28  ..  PAGERTRACE4(
264a0 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
264b0 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
264c0 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c  %s nTrunc=%d\n",
264d0 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
264e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74  zFilename, zMast
264f0 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 70  er, nTrunc);.  p
26500 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
26510 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
26520 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
26530 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
26540 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
26550 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
26560 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
26570 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
26580 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
26590 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
265a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
265b0 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21  AGER_SYNCED && !
265c0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
265d0 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20  >dirtyCache ){. 
265e0 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a     PgHdr *pPg;..
265f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
26600 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
26610 45 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74 6f  E.    /* The ato
26620 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
26630 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
26640 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
26650 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
26660 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
26670 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  **.    **    + T
26680 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
26690 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d  upports the atom
266a0 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
266b0 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20  y for.    **    
266c0 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65    blocks of size
266d0 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a   page-size, and.
266e0 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 69 73      **    + This
266f0 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70   commit is not p
26700 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
26710 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ile transaction,
26720 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b   and.    **    +
26730 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   Exactly one pag
26740 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
26750 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  ied and store in
26760 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26770 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
26780 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
26790 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
267a0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
267b0 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76  al file will nev
267c0 65 72 0a 20 20 20 20 2a 2a 20 62 65 20 63 72 65  er.    ** be cre
267d0 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72  ated for this tr
267e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a  ansaction..    *
267f0 2f 0a 20 20 20 20 69 6e 74 20 75 73 65 41 74 6f  /.    int useAto
26800 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20 20  micWrite = (.   
26810 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26 26       !zMaster &&
26820 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
26830 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
26840 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
26850 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
26860 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
26870 65 72 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  er) && .        
26880 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a 20 20  nTrunc==0 && .  
26890 20 20 20 20 20 20 28 30 3d 3d 70 50 61 67 65 72        (0==pPager
268a0 2d 3e 70 44 69 72 74 79 20 7c 7c 20 30 3d 3d 70  ->pDirty || 0==p
268b0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70  Pager->pDirty->p
268c0 44 69 72 74 79 29 0a 20 20 20 20 29 3b 0a 20 20  Dirty).    );.  
268d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
268e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
268f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26900 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
26910 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20  NALMODE_OFF );. 
26920 20 20 20 69 66 28 20 75 73 65 41 74 6f 6d 69 63     if( useAtomic
26930 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  Write ){.      /
26940 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e 52 65  * Update the nRe
26950 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6a  c field in the j
26960 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
26970 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73 65 74        int offset
26980 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
26990 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61  alHdr + sizeof(a
269a0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20  JournalMagic);. 
269b0 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
269c0 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20 20  er->nRec==1);.  
269d0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
269e0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
269f0 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67 65 72  , offset, pPager
26a00 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
26a10 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62  /* Update the db
26a20 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75   file change cou
26a30 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  nter. The follow
26a40 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f  ing call will mo
26a50 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  dify.      ** th
26a60 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
26a70 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61  esentation of pa
26a80 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64 65 20  ge 1 to include 
26a90 74 68 65 20 75 70 64 61 74 65 64 0a 20 20 20 20  the updated.    
26aa0 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e    ** change coun
26ab0 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69  ter and then wri
26ac0 74 65 20 70 61 67 65 20 31 20 64 69 72 65 63 74  te page 1 direct
26ad0 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ly to the databa
26ae0 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  se.      ** file
26af0 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65  . Because of the
26b00 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
26b10 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f  operty of the ho
26b20 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  st file-system, 
26b30 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69  .      ** this i
26b40 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f  s safe..      */
26b50 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
26b60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26b70 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
26b80 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
26b90 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  r(pPager, 1);.  
26ba0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
26bb0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26bc0 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65  te3JournalCreate
26bd0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
26be0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 75     }..    if( !u
26bf0 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 26 26  seAtomicWrite &&
26c00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26c10 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
26c20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
26c30 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
26c40 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
26c50 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20  ritten to the.  
26c60 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
26c70 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20  e, then no sync 
26c80 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  is required. Thi
26c90 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69  s happens when i
26ca0 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74  t is.    ** writ
26cb0 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72  ten, then the pr
26cc0 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75  ocess fails to u
26cd0 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
26ce0 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20  SERVED to an.   
26cf0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
26d00 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d  ck. The next tim
26d10 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72  e the process tr
26d20 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ies to commit th
26d30 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
26d40 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d  tion the m-j nam
26d50 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
26d60 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
26d70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
26d80 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
26d90 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ter ){.      rc 
26da0 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
26db0 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
26dc0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 0);.      if(
26dd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26de0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
26df0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26e00 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
26e10 20 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63        if( nTrunc
26e20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
26e30 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
26e40 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
26e50 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
26e60 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
26e70 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ges.        ** b
26e80 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
26e90 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
26ea0 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
26eb0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
26ec0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e          ** file.
26ed0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26ee0 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20      Pgno i;.    
26ef0 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20      int iSkip = 
26f00 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
26f10 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66  ager);.        f
26f20 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20  or( i=nTrunc+1; 
26f30 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  i<=pPager->origD
26f40 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  bSize; i++ ){.  
26f50 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
26f60 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
26f70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
26f80 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69  l, i) && i!=iSki
26f90 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p ){.           
26fa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26fb0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
26fc0 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20   &pPg);.        
26fd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26fe0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
26ff0 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
27000 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27010 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b  PagerWrite(pPg);
27020 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
27030 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
27040 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
27050 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27060 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
27070 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xit;.          }
27080 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
27090 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
270a0 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
270b0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
270c0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
270d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
270e0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
270f0 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  xit;.      rc = 
27100 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
27110 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  er);.    }.    i
27120 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27130 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
27140 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t;..#ifndef SQLI
27150 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
27160 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e  UM.    if( nTrun
27170 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c!=0 ){.      rc
27180 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
27190 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
271a0 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69  nTrunc);.      i
271b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
271c0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
271d0 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
271e0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
271f0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
27200 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27210 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
27220 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
27230 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
27240 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
27250 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
27260 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
27270 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
27290 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  !=SQLITE_IOERR_B
272a0 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20  LOCKED );.      
272b0 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 69 67  /* The error mig
272c0 68 74 20 68 61 76 65 20 6c 65 66 74 20 74 68 65  ht have left the
272d0 20 64 69 72 74 79 20 6c 69 73 74 20 61 6c 6c 20   dirty list all 
272e0 66 6f 75 6c 65 64 20 75 70 20 68 65 72 65 2c 0a  fouled up here,.
272f0 20 20 20 20 20 20 2a 2a 20 62 75 74 20 74 68 61        ** but tha
27300 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  t does not matte
27310 72 20 62 65 63 61 75 73 65 20 69 66 20 74 68 65  r because if the
27320 20 69 66 20 74 68 65 20 64 69 72 74 79 20 6c 69   if the dirty li
27330 73 74 20 64 69 64 0a 20 20 20 20 20 20 2a 2a 20  st did.      ** 
27340 67 65 74 20 63 6f 72 72 75 70 74 65 64 2c 20 74  get corrupted, t
27350 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
27360 69 6f 6e 20 77 69 6c 6c 20 72 6f 6c 6c 20 62 61  ion will roll ba
27370 63 6b 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ck and.      ** 
27380 64 69 73 63 61 72 64 20 74 68 65 20 64 69 72 74  discard the dirt
27390 79 20 6c 69 73 74 2e 20 20 54 68 65 72 65 20 69  y list.  There i
273a0 73 20 61 6e 20 61 73 73 65 72 74 20 69 6e 0a 20  s an assert in. 
273b0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 67 65       ** pager_ge
273c0 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
273d0 73 28 29 20 74 68 61 74 20 76 65 72 69 66 69 65  s() that verifie
273e0 73 20 74 68 61 74 20 6e 6f 20 61 74 74 65 6d 70  s that no attemp
273f0 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 61  t.      ** is ma
27400 64 65 20 74 6f 20 75 73 65 20 61 6e 20 69 6e 76  de to use an inv
27410 61 6c 69 64 20 64 69 72 74 79 20 6c 69 73 74 2e  alid dirty list.
27420 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27430 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
27440 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
27450 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20  ->pDirty = 0;.. 
27460 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
27470 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
27480 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
27490 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53  ->noSync && !noS
274a0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
274b0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
274c0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
274d0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
274e0 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
274f0 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
27500 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
27510 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
27520 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20   PAGER_SYNCED;. 
27530 20 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42   }else if( MEMDB
27540 20 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b   && nTrunc!=0 ){
27550 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27560 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
27570 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
27580 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a    }..sync_exit:.
27590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
275a0 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
275b0 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69  {.    /* pager_i
275c0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
275d0 72 28 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20  r() may attempt 
275e0 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  to obtain an exc
275f0 6c 75 73 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f  lusive.     * lo
27600 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20  ck to spill the 
27610 63 61 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e  cache and return
27620 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20   IOERR_BLOCKED. 
27630 42 75 74 20 73 69 6e 63 65 20 0a 20 20 20 20 20  But since .     
27640 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  * there is no ch
27650 61 6e 63 65 20 74 68 65 20 63 61 63 68 65 20 69  ance the cache i
27660 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20  s inconsistent, 
27670 69 74 20 69 73 0a 20 20 20 20 20 2a 20 62 65 74  it is.     * bet
27680 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ter to return SQ
27690 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 20  LITE_BUSY..     
276a0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
276b0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70  TE_BUSY;.  }.  p
276c0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
276d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
276e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
276f0 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
27700 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
27710 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
27720 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
27730 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
27740 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
27750 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
27760 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
27770 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
27780 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
27790 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
277a0 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
277b0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
277c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
277d0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
277e0 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
277f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
27800 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
27810 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
27820 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
27830 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
27840 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
27850 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
27860 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
27870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
27880 4f 52 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 45  OR;.  }.  pagerE
27890 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
278a0 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d  PAGERTRACE2("COM
278b0 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
278c0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
278d0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
278e0 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
278f0 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
27900 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69  pPager);.    whi
27910 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  le( pPg ){.     
27920 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
27930 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
27940 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
27950 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
27960 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20  ry(pHist);.     
27970 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
27980 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
27990 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
279a0 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d   pHist->inStmt =
279b0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
279c0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
279d0 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
279e0 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
279f0 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
27a00 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69    pPg = pPg->pDi
27a10 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rty;.    }.    p
27a20 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
27a30 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  0;.#ifndef NDEBU
27a40 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  G.    for(pPg=pP
27a50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
27a60 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
27a70 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
27a80 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
27a90 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
27aa0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
27ab0 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
27ac0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
27ad0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
27ae0 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
27af0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
27b00 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
27b10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
27b20 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
27b30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
27b40 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
27b50 45 44 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61  ED;.    pagerLea
27b60 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
27b70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27b80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
27b90 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
27ba0 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21  AGER_SYNCED || !
27bb0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
27bc0 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  he );.  rc = pag
27bd0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
27be0 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  on(pPager);.  rc
27bf0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
27c00 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61  Pager, rc);.  pa
27c10 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
27c20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
27c30 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
27c40 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
27c50 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
27c60 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
27c70 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20  SHARED mode..** 
27c80 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  All in-memory ca
27c90 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74  che pages revert
27ca0 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e   to their origin
27cb0 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73  al data contents
27cc0 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ..** The journal
27cd0 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
27ce0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
27cf0 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65  cannot fail unle
27d00 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ss some other pr
27d10 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
27d20 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  lowing.** the co
27d30 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72  rrect locking pr
27d40 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73  otocol or unless
27d50 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
27d60 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
27d70 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65  g trash into the
27d80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53   journal file (S
27d90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f  QLITE_CORRUPT) o
27da0 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72  r.** unless a pr
27db0 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ior malloc() fai
27dc0 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  led (SQLITE_NOME
27dd0 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  M).  Appropriate
27de0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20   error.** codes 
27df0 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72  are returned for
27e00 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73   all these occas
27e10 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65  ions.  Otherwise
27e20 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
27e30 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
27e40 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
27e50 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
27e60 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
27e70 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
27e80 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
27e90 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
27ea0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
27eb0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
27ec0 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72      for(p=pPager
27ed0 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
27ee0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
27ef0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
27f00 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
27f10 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62   !p->alwaysRollb
27f20 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ack );.      if(
27f30 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20   !p->dirty ){.  
27f40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
27f50 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
27f60 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
27f70 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b  ager))->pOrig );
27f80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27f90 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
27fa0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
27fb0 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74   pPager))->pStmt
27fc0 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
27fd0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
27fe0 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
27ff0 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
28000 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
28010 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
28020 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
28030 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
28040 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  , pHist->pOrig, 
28050 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
28060 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
28070 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b  TRACE3("ROLLBACK
28080 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e  -PAGE %d of %d\n
28090 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
280a0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
280b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
280c0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
280d0 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e  PAGE %d is clean
280e0 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   on %d\n", p->pg
280f0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
28100 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er));.      }.  
28110 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
28120 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
28130 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
28140 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20     p->inJournal 
28150 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74  = 0;.      pHist
28160 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
28170 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76      pHist->pPrev
28180 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e  Stmt = pHist->pN
28190 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
281a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
281b0 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
281c0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
281d0 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72 2d  niter(p, pPager-
281e0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
281f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
28200 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
28210 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
28220 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
28230 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
28240 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
28250 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e  ;.    pager_trun
28260 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
28270 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
28280 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
28290 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
282a0 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
282b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
282c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 61  TE_OK;.  }..  pa
282d0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
282e0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
282f0 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
28300 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28310 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
28320 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
28330 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
28340 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
28350 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
28360 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
28370 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
28380 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
28390 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
283a0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
283b0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
283c0 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
283d0 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61      pager_playba
283e0 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
283f0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c 65     }.    pagerLe
28400 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
28410 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
28420 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
28430 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
28440 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
28450 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
28460 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
28470 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
28480 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70   0);.    rc2 = p
28490 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
284a0 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
284b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
284c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
284d0 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc2;.    }.  }
284e0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
284f0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
28500 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
28510 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  /* pager_reset(p
28520 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61  Pager); */.  pPa
28530 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
28540 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
28550 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
28560 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65  g a ROLLBACK, we
28570 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74   can no longer t
28580 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20  rust the pager. 
28590 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
285a0 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
285b0 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
285c0 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
285d0 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65  r .  ** persiste
285e0 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  nt..  */.  rc = 
285f0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
28600 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72  er, rc);.  pager
28610 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
28620 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28630 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
28640 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
28650 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
28660 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
28670 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
28680 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
28690 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
286a0 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
286b0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
286c0 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
286d0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
286e0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
286f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
28700 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
28710 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
28720 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
28730 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
28740 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
28750 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
28760 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65  ->nRef;.}..#ifde
28770 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
28780 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
28790 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
287a0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
287b0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
287c0 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74  sqlite3PagerStat
287d0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
287e0 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  {.  static int a
287f0 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  [11];.  a[0] = p
28800 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
28810 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
28820 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
28830 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
28840 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
28850 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
28860 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
28870 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
28880 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20  errCode;.  a[6] 
28890 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
288a0 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
288b0 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
288c0 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20   0;  /* Used to 
288d0 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c  be pPager->nOvfl
288e0 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61   */.  a[9] = pPa
288f0 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b  ger->nRead;.  a[
28900 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57  10] = pPager->nW
28910 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61  rite;.  return a
28920 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
28930 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d  * Set the statem
28940 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69  ent rollback poi
28950 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
28960 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
28970 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
28980 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
28990 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20  rnal already.** 
289a0 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61  open.  A new sta
289b0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
289c0 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63  s created that c
289d0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f  an be used to ro
289e0 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65  llback.** change
289f0 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51  s of a single SQ
28a00 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e  L command within
28a10 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61   a larger transa
28a20 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
28a30 20 69 6e 74 20 70 61 67 65 72 53 74 6d 74 42 65   int pagerStmtBe
28a40 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
28a50 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
28a60 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
28a70 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20  >stmtInUse );.  
28a80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28a90 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
28aa0 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RED );.  assert(
28ab0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
28ac0 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41  =0 );.  PAGERTRA
28ad0 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20  CE2("STMT-BEGIN 
28ae0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28af0 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
28b00 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
28b10 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
28b20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
28b30 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
28b40 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65  ->dbSize;.    re
28b50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28b60 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
28b70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
28b80 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
28b90 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a  mtAutoopen = 1;.
28ba0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28bb0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
28bc0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
28bd0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 61 67  nalOpen );.  pag
28be0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
28bf0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
28c00 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29 3b  r->pInStmt==0 );
28c10 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  .  pPager->pInSt
28c20 6d 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  mt = sqlite3Bitv
28c30 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
28c40 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61 67 65  >dbSize);.  page
28c50 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
28c60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
28c70 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nStmt==0 ){.    
28c80 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  /* sqlite3OsLock
28c90 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
28ca0 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20  RED_LOCK); */.  
28cb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28cc0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61  NOMEM;.  }.  pPa
28cd0 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
28ce0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28cf0 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  Off;.  pPager->s
28d00 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
28d10 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67  ->dbSize;.  pPag
28d20 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d  er->stmtHdrOff =
28d30 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
28d40 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  mtCksum = pPager
28d50 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69  ->cksumInit;.  i
28d60 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  f( !pPager->stmt
28d70 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
28d80 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
28d90 6e 74 65 6d 70 28 70 50 61 67 65 72 2d 3e 70 56  ntemp(pPager->pV
28da0 66 73 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64  fs, pPager->stfd
28db0 2c 20 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a  , pPager->zStmtJ
28dc0 72 6e 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rnl,.           
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28de0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53     SQLITE_OPEN_S
28df0 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  UBJOURNAL);.    
28e00 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
28e10 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
28e20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
28e30 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
28e40 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
28e50 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
28e60 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
28e70 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
28e80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28e90 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f  K;. .stmt_begin_
28ea0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
28eb0 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 29 7b  ager->pInStmt ){
28ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
28ed0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
28ee0 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20  ->pInStmt);.    
28ef0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
28f00 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
28f10 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
28f20 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
28f30 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
28f40 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61  {.  int rc;.  pa
28f50 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
28f60 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 74  ;.  rc = pagerSt
28f70 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b  mtBegin(pPager);
28f80 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
28f90 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
28fa0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
28fb0 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  mit a statement.
28fc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
28fd0 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50  agerStmtCommit(P
28fe0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
28ff0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
29000 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
29010 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
29020 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20      PgHdr *pPg, 
29030 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50 41 47 45  *pNext;.    PAGE
29040 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f  RTRACE2("STMT-CO
29050 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
29060 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
29070 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
29080 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
29090 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
290a0 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a  r->stfd, 0); */.
290b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
290c0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
290d0 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20  r->pInStmt);.   
290e0 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74     pPager->pInSt
290f0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  mt = 0;.    }els
29100 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67  e{.      for(pPg
29110 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
29120 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
29130 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
29140 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
29150 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
29160 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
29170 70 4e 65 78 74 20 3d 20 70 48 69 73 74 2d 3e 70  pNext = pHist->p
29180 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20  NextStmt;.      
29190 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
291a0 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  >inStmt );.     
291b0 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
291c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 48   = 0;.        pH
291d0 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  ist->pPrevStmt =
291e0 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
291f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  t = 0;.        s
29200 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73  qlite3_free(pHis
29210 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
29220 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
29230 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
29240 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
29250 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20  tmtNRec = 0;.   
29260 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
29270 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
29280 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
29290 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
292a0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
292b0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
292c0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
292d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
292e0 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61  * Rollback a sta
292f0 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
29300 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52  qlite3PagerStmtR
29310 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
29320 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
29330 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
29340 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
29350 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
29360 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
29370 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43  E2("STMT-ROLLBAC
29380 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
29390 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
293a0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
293b0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
293c0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
293d0 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  Hist;.      for(
293e0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
293f0 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48 69 73  t; pPg; pPg=pHis
29400 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20  t->pNextStmt){. 
29410 20 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50         pHist = P
29420 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
29430 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
29440 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
29450 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
29460 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
29470 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73  _DATA(pPg), pHis
29480 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72  t->pStmt, pPager
29490 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
294a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
294b0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
294c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
294d0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
294e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
294f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
29500 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
29510 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20  stmtSize;.      
29520 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
29530 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
29540 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29550 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
29560 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
29570 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50  stmt_playback(pP
29580 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
29590 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
295a0 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  tCommit(pPager);
295b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
295c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
295d0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
295e0 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
295f0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
29600 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
29610 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
29620 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
29630 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
29640 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
29650 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
29660 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67  agerFilename(Pag
29670 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
29680 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46  eturn pPager->zF
29690 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
296a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46 53  * Return the VFS
296b0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
296c0 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e  he pager..*/.con
296d0 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  st sqlite3_vfs *
296e0 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
296f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
29700 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
29710 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pVfs;.}../*.** 
29720 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20  Return the file 
29730 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64  handle for the d
29740 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73  atabase file ass
29750 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
29760 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
29770 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55   might return NU
29780 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20 68  LL if the file h
29790 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65  as.** not yet be
297a0 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71  en opened..*/.sq
297b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69  lite3_file *sqli
297c0 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61 67  te3PagerFile(Pag
297d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
297e0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64  eturn pPager->fd
297f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
29800 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
29810 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
29820 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
29830 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
29840 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a  rDirname(Pager *
29850 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
29860 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  n pPager->zDirec
29870 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  tory;.}../*.** R
29880 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
29890 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
298a0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
298b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
298c0 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e  te3PagerJournaln
298d0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
298e0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
298f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d  ger->zJournal;.}
29900 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
29910 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63  rue if fsync() c
29920 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65  alls are disable
29930 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  d for this pager
29940 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
29950 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61  ** if fsync()s a
29960 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d  re executed norm
29970 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ally..*/.int sql
29980 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
29990 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
299a0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
299b0 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64  >noSync;.}..#ifd
299c0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
299d0 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  DEC./*.** Set th
299e0 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73  e codec for this
299f0 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73   pager.*/.void s
29a00 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f  qlite3PagerSetCo
29a10 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50  dec(.  Pager *pP
29a20 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a  ager,.  void *(*
29a30 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
29a40 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20  id*,Pgno,int),. 
29a50 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
29a60 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  .){.  pPager->xC
29a70 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20  odec = xCodec;. 
29a80 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41   pPager->pCodecA
29a90 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a  rg = pCodecArg;.
29aa0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
29ab0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
29ac0 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d  TOVACUUM./*.** M
29ad0 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50 67  ove the page pPg
29ae0 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e   to location pgn
29af0 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  o in the file..*
29b00 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
29b10 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73  be no references
29b20 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72 65   to the page pre
29b30 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20  viously located 
29b40 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63  at.** pgno (whic
29b50 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64  h we call pPgOld
29b60 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70 61  ) though that pa
29b70 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  ge is allowed to
29b80 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e   be.** in cache.
29b90 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70 72    If the page pr
29ba0 65 76 69 6f 75 73 20 6c 6f 63 61 74 65 64 20 61  evious located a
29bb0 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  t pgno is not al
29bc0 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20  ready.** in the 
29bd0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
29be0 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20  , it is not put 
29bf0 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73  there by by this
29c00 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
29c10 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  References to th
29c20 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69  e page pPg remai
29c30 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e  n valid. Updatin
29c40 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61  g any.** meta-da
29c50 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
29c60 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74  th pPg (i.e. dat
29c70 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
29c80 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
29c90 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
29ca0 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69  with the page) i
29cb0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
29cc0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
29cd0 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  er..**.** A tran
29ce0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
29cf0 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73  active when this
29d00 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
29d10 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  ed. It used to b
29d20 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68  e.** required th
29d30 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  at a statement t
29d40 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e  ransaction was n
29d50 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74  ot active, but t
29d60 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a  his restriction.
29d70 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f  ** has been remo
29d80 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45  ved (CREATE INDE
29d90 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20  X needs to move 
29da0 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74  a page when a st
29db0 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
29dc0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
29dd0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
29de0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50  3PagerMovepage(P
29df0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62  ager *pPager, Db
29e00 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20  Page *pPg, Pgno 
29e10 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
29e20 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20  pPgOld;  /* The 
29e30 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77  page being overw
29e40 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74  ritten. */.  int
29e50 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   h;.  Pgno needS
29e60 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20  yncPgno = 0;..  
29e70 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
29e80 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  r);.  assert( pP
29e90 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
29ea0 50 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f 56  PAGERTRACE5("MOV
29eb0 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65  E %d page %d (ne
29ec0 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73  edSync=%d) moves
29ed0 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20   to %d\n", .    
29ee0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
29ef0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
29f00 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e  g->needSync, pgn
29f10 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  o);.  IOTRACE(("
29f20 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22  MOVE %p %d %d\n"
29f30 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
29f40 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70  gno, pgno))..  p
29f50 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
29f60 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67  (pPg);.  if( pPg
29f70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
29f80 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d    needSyncPgno =
29f90 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
29fa0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
29fb0 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
29fc0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
29fd0 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  DbSize );.    as
29fe0 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
29ff0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a000 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2a010 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   );.  }..  /* Un
2a020 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74  link pPg from it
2a030 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a  s hash-chain */.
2a040 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
2a050 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  n(pPager, pPg);.
2a060 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63  .  /* If the cac
2a070 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61  he contains a pa
2a080 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  ge with page-num
2a090 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65  ber pgno, remove
2a0a0 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74   it.  ** from it
2a0b0 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
2a0c0 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72  so, if the PgHdr
2a0d0 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65  .needSync was se
2a0e0 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  t for .  ** page
2a0f0 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65   pgno before the
2a100 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f   'move' operatio
2a110 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  n, it needs to b
2a120 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a  e retained .  **
2a130 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f   for the page mo
2a140 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a  ved there..  */.
2a150 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
2a160 3d 20 30 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20  = 0;.  pPgOld = 
2a170 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
2a180 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
2a190 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
2a1a0 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e  assert( pPgOld->
2a1b0 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75  nRef==0 );.    u
2a1c0 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
2a1d0 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a  Pager, pPgOld);.
2a1e0 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
2a1f0 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67 2d 3e  gOld);.    pPg->
2a200 6e 65 65 64 53 79 6e 63 20 3d 20 70 50 67 4f 6c  needSync = pPgOl
2a210 64 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a 20 20 7d  d->needSync;.  }
2a220 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e 6e  else{.    pPg->n
2a230 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  eedSync = 0;.  }
2a240 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  .  pPg->inJourna
2a250 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
2a260 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
2a270 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b  nJournal, pgno);
2a280 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68  ..  /* Change th
2a290 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
2a2a0 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74  r pPg and insert
2a2b0 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77   it into the new
2a2c0 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a   hash-chain. */.
2a2d0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
2a2e0 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f  0 );.  pPg->pgno
2a2f0 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70   = pgno;.  h = p
2a300 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
2a310 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20 70  Hash-1);.  if( p
2a320 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
2a330 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2a340 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d  Pager->aHash[h]-
2a350 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
2a360 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
2a370 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
2a380 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50   = pPg;.  }.  pP
2a390 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
2a3a0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
2a3b0 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  .  pPager->aHash
2a3c0 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67  [h] = pPg;.  pPg
2a3d0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
2a3e0 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50  ..  makeDirty(pP
2a3f0 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69  g);.  pPager->di
2a400 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20  rtyCache = 1;.. 
2a410 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e   if( needSyncPgn
2a420 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  o ){.    /* If n
2a430 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e  eedSyncPgno is n
2a440 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
2a450 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
2a460 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20  eeds to be .    
2a470 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  ** sync()ed befo
2a480 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77  re any data is w
2a490 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61  ritten to databa
2a4a0 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65  se file page nee
2a4b0 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a  dSyncPgno..    *
2a4c0 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20  * Currently, no 
2a4d0 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
2a4e0 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
2a4f0 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  he and the .    
2a500 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
2a510 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e  nal bit has been
2a520 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73   set. This needs
2a530 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20   to be remedied 
2a540 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a  by loading.    *
2a550 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  * the page into 
2a560 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
2a570 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20  and setting the 
2a580 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66  PgHdr.needSync f
2a590 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
2a5a0 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70  ** If the attemp
2a5b0 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61  t to load the pa
2a5c0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
2a5d0 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64  -cache fails, (d
2a5e0 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d  ue.    ** to a m
2a5f0 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61  alloc() or IO fa
2a600 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68  ilure), clear th
2a610 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e  e bit in the pIn
2a620 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a  Journal[].    **
2a630 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
2a640 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  e, if the page i
2a650 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69  s loaded and wri
2a660 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20  tten again in.  
2a670 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
2a680 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65  ction, it may be
2a690 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2a6a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
2a6b0 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  fore.    ** it i
2a6c0 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  s synced into th
2a6d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
2a6e0 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79  This way, it may
2a6f0 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a   end up in.    *
2a700 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
2a710 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68  le twice, but th
2a720 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  at is not a prob
2a730 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lem..    **.    
2a740 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61  ** The sqlite3Pa
2a750 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61  gerGet() call ma
2a760 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
2a770 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
2a780 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
2a790 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
2a7a0 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
2a7b0 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
2a7c0 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64  int rc;.    PgHd
2a7d0 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61  r *pPgHdr;.    a
2a7e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2a7f0 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72  eedSync );.    r
2a800 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2a810 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64  Get(pPager, need
2a820 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64  SyncPgno, &pPgHd
2a830 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2a840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a850 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
2a860 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  InJournal && (in
2a870 74 29 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d  t)needSyncPgno<=
2a880 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
2a890 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ze ){.        sq
2a8a0 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61 72  lite3BitvecClear
2a8b0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
2a8c0 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e  nal, needSyncPgn
2a8d0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
2a8e0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
2a8f0 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ger);.      retu
2a900 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2a910 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
2a920 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64  c = 1;.    pPgHd
2a930 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
2a940 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a  .    pPgHdr->inJ
2a950 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
2a960 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72  makeDirty(pPgHdr
2a970 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
2a980 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
2a990 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 4c 65  ;.  }..  pagerLe
2a9a0 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
2a9b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a9c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
2a9d0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
2a9e0 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f  r to the data fo
2a9f0 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
2aa00 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
2aa10 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
2aa20 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ta(DbPage *pPg){
2aa30 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f  .  return PGHDR_
2aa40 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a  TO_DATA(pPg);.}.
2aa50 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
2aa60 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
2aa70 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
2aa80 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61  s of "extra" spa
2aa90 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  ce .** allocated
2aaa0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
2aab0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
2aac0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
2aad0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62  PagerGetExtra(Db
2aae0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
2aaf0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2ab00 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74  g->pPager;.  ret
2ab10 75 72 6e 20 28 70 50 61 67 65 72 3f 50 47 48 44  urn (pPager?PGHD
2ab20 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
2ab30 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f  pPager):0);.}../
2ab40 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
2ab50 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f   locking-mode fo
2ab60 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
2ab70 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
2ab80 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20  st be one.** of 
2ab90 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2aba0 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c  E_QUERY, PAGER_L
2abb0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
2abc0 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c  L or .** PAGER_L
2abd0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2abe0 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72  SIVE. If the par
2abf0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51  ameter is not _Q
2ac00 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  UERY, then.** th
2ac10 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69  e locking-mode i
2ac20 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
2ac30 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  ue specified..**
2ac40 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
2ac50 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
2ac60 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2ac70 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20  DE_NORMAL or.** 
2ac80 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2ac90 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64  E_EXCLUSIVE, ind
2aca0 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72  icating the curr
2acb0 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
2acc0 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e  dated).** lockin
2acd0 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  g-mode..*/.int s
2ace0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
2acf0 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  ngMode(Pager *pP
2ad00 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
2ad10 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  {.  assert( eMod
2ad20 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2ad30 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
2ad40 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
2ad50 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2ad60 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  DE_NORMAL.      
2ad70 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
2ad80 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2ad90 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
2ada0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
2adb0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
2adc0 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  <0 );.  assert( 
2add0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2ade0 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50  E_NORMAL>=0 && P
2adf0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2ae00 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b  _EXCLUSIVE>=0 );
2ae10 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20  .  if( eMode>=0 
2ae20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
2ae30 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67  File ){.    pPag
2ae40 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2ae50 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  e = eMode;.  }. 
2ae60 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
2ae70 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2ae80 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  de;.}../*.** Get
2ae90 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  /set the journal
2aea0 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
2aeb0 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
2aec0 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
2aed0 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4a 4f  e.** of PAGER_JO
2aee0 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 2c  URNALMODE_QUERY,
2aef0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2af00 44 45 5f 44 45 4c 45 54 45 20 6f 72 20 0a 2a 2a  DE_DELETE or .**
2af10 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2af20 44 45 5f 50 45 52 53 49 53 54 2e 20 49 66 20 74  DE_PERSIST. If t
2af30 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
2af40 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
2af50 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  .** the journal-
2af60 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
2af70 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  he value specifi
2af80 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
2af90 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
2afa0 65 69 74 68 65 72 20 50 41 47 45 52 5f 4a 4f 55  either PAGER_JOU
2afb0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
2afc0 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  or.** PAGER_JOUR
2afd0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2c  NALMODE_PERSIST,
2afe0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
2aff0 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
2b000 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6a 6f  y updated).** jo
2b010 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  urnal-mode..*/.i
2b020 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  nt sqlite3PagerJ
2b030 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72  ournalMode(Pager
2b040 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
2b050 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
2b060 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
2b070 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20  RNALMODE_QUERY. 
2b080 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
2b090 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2b0a0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20  ALMODE_DELETE.  
2b0b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
2b0c0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2b0d0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
2b0e0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
2b0f0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2b100 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61  LMODE_OFF );.  a
2b110 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
2b120 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30  RNALMODE_QUERY<0
2b130 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2b140 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2b150 44 45 4c 45 54 45 3e 3d 30 20 26 26 20 50 41 47  DELETE>=0 && PAG
2b160 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
2b170 45 52 53 49 53 54 3e 3d 30 20 29 3b 0a 20 20 69  ERSIST>=0 );.  i
2b180 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20  f( eMode>=0 ){. 
2b190 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2b1a0 61 6c 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a  alMode = eMode;.
2b1b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
2b1c0 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t)pPager->journa
2b1d0 6c 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 64 65 66  lMode;.}..#ifdef
2b1e0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
2b1f0 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69  ** Print a listi
2b200 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65  ng of all refere
2b210 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74  nced pages and t
2b220 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a  heir ref count..
2b230 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
2b240 61 67 65 72 52 65 66 64 75 6d 70 28 50 61 67 65  agerRefdump(Page
2b250 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
2b260 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
2b270 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
2b280 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
2b290 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
2b2a0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
2b2b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2b2c0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2b2d0 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
2b2e0 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  r=%p nRef=%d\n",
2b2f0 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67   .       pPg->pg
2b300 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  no, PGHDR_TO_DAT
2b310 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65  A(pPg), pPg->nRe
2b320 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
2b330 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
2b340 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
2b350 2f 0a                                            /.