/ Hex Artifact Content
Login

Artifact 2361c00a4cf7936ef7e1463c224214c6fe6ee2cd:


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 33  : pager.c,v 1.43
0350: 35 20 32 30 30 38 2f 30 34 2f 32 35 20 31 32 3a  5 2008/04/25 12:
0360: 32 35 3a 34 32 20 64 72 68 20 45 78 70 20 24 0a  25:42 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: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
5eb0: 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20 20 20 20  tex *mutex;.    
5ec0: 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65    mutex = sqlite
5ed0: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
5ee0: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
5ef0: 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 20 20 70  C_MEM2);.      p
5f00: 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a  ->iInUseDB = 0;.
5f10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
5f20: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29  tex_enter(mutex)
5f30: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e 55 73  ;.      p->iInUs
5f40: 65 44 42 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  eDB = 1;.      s
5f50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5f60: 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  ve(mutex);.    }
5f70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
5f80: 69 49 6e 55 73 65 4d 4d 3d 3d 30 20 29 3b 0a 20  iInUseMM==0 );. 
5f90: 20 7d 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64   }.  static void
5fa0: 20 70 61 67 65 72 4c 65 61 76 65 28 50 61 67 65   pagerLeave(Page
5fb0: 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49  r *p){.    p->iI
5fc0: 6e 55 73 65 44 42 2d 2d 3b 0a 20 20 20 20 61 73  nUseDB--;.    as
5fd0: 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73 65 44  sert( p->iInUseD
5fe0: 42 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  B>=0 );.  }.#els
5ff0: 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
6000: 45 6e 74 65 72 28 58 29 0a 23 20 64 65 66 69 6e  Enter(X).# defin
6010: 65 20 70 61 67 65 72 4c 65 61 76 65 28 58 29 0a  e pagerLeave(X).
6020: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64  #endif../*.** Ad
6030: 64 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  d page pPg to th
6040: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69 6e  e end of the lin
6050: 6b 65 64 20 6c 69 73 74 20 6d 61 6e 61 67 65 64  ked list managed
6060: 20 62 79 20 73 74 72 75 63 74 75 72 65 0a 2a 2a   by structure.**
6070: 20 70 4c 69 73 74 20 28 70 50 67 20 62 65 63 6f   pList (pPg beco
6080: 6d 65 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74  mes the last ent
6090: 72 79 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2d  ry in the list -
60a0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
60b0: 6c 79 20 0a 2a 2a 20 75 73 65 64 29 2e 20 41 72  ly .** used). Ar
60c0: 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f  gument pLink sho
60d0: 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 65 69 74  uld point to eit
60e0: 68 65 72 20 70 50 67 2d 3e 66 72 65 65 20 6f 72  her pPg->free or
60f0: 20 70 50 67 2d 3e 67 66 72 65 65 2c 0a 2a 2a 20   pPg->gfree,.** 
6100: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
6110: 74 68 65 72 20 70 50 67 20 69 73 20 62 65 69 6e  ther pPg is bein
6120: 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  g added to the p
6130: 61 67 65 72 2d 73 70 65 63 69 66 69 63 20 6f 72  ager-specific or
6140: 0a 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c  .** global LRU l
6150: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
6160: 6f 69 64 20 6c 69 73 74 41 64 64 28 50 61 67 65  oid listAdd(Page
6170: 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c  rLruList *pList,
6180: 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70   PagerLruLink *p
6190: 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50 67  Link, PgHdr *pPg
61a0: 29 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78  ){.  pLink->pNex
61b0: 74 20 3d 20 30 3b 0a 20 20 70 4c 69 6e 6b 2d 3e  t = 0;.  pLink->
61c0: 70 50 72 65 76 20 3d 20 70 4c 69 73 74 2d 3e 70  pPrev = pList->p
61d0: 4c 61 73 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  Last;..#ifdef SQ
61e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
61f0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
6200: 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70  assert(pLink==&p
6210: 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e  Pg->free || pLin
6220: 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b  k==&pPg->gfree);
6230: 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d  .  assert(pLink=
6240: 3d 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20  =&pPg->gfree || 
6250: 70 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c  pList!=&sqlite3L
6260: 72 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e  ruPageList);.#en
6270: 64 69 66 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  dif..  if( pList
6280: 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69  ->pLast ){.    i
6290: 6e 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20  nt iOff = (char 
62a0: 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20  *)pLink - (char 
62b0: 2a 29 70 50 67 3b 0a 20 20 20 20 50 61 67 65 72  *)pPg;.    Pager
62c0: 4c 72 75 4c 69 6e 6b 20 2a 70 4c 61 73 74 4c 69  LruLink *pLastLi
62d0: 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69  nk = (PagerLruLi
62e0: 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c  nk *)(&((u8 *)pL
62f0: 69 73 74 2d 3e 70 4c 61 73 74 29 5b 69 4f 66 66  ist->pLast)[iOff
6300: 5d 29 3b 0a 20 20 20 20 70 4c 61 73 74 4c 69 6e  ]);.    pLastLin
6310: 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 50 67 3b 0a  k->pNext = pPg;.
6320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
6330: 65 72 74 28 21 70 4c 69 73 74 2d 3e 70 46 69 72  ert(!pList->pFir
6340: 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  st);.    pList->
6350: 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20  pFirst = pPg;.  
6360: 7d 0a 0a 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73  }..  pList->pLas
6370: 74 20 3d 20 70 50 67 3b 0a 20 20 69 66 28 20 21  t = pPg;.  if( !
6380: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e  pList->pFirstSyn
6390: 63 65 64 20 26 26 20 70 50 67 2d 3e 6e 65 65 64  ced && pPg->need
63a0: 53 79 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Sync==0 ){.    p
63b0: 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63  List->pFirstSync
63c0: 65 64 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a  ed = pPg;.  }.}.
63d0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 50  ./*.** Remove pP
63e0: 67 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  g from the list 
63f0: 6d 61 6e 61 67 65 64 20 62 79 20 74 68 65 20 73  managed by the s
6400: 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
6410: 20 74 6f 20 62 79 20 70 4c 69 73 74 2e 0a 2a 2a   to by pList..**
6420: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 4c 69  .** Argument pLi
6430: 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20  nk should point 
6440: 74 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e 66  to either pPg->f
6450: 72 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72 65  ree or pPg->gfre
6460: 65 2c 20 64 65 70 65 6e 64 69 6e 67 20 0a 2a 2a  e, depending .**
6470: 20 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67 20   on whether pPg 
6480: 69 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  is being added t
6490: 6f 20 74 68 65 20 70 61 67 65 72 2d 73 70 65 63  o the pager-spec
64a0: 69 66 69 63 20 6f 72 20 67 6c 6f 62 61 6c 20 4c  ific or global L
64b0: 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  RU list..*/.stat
64c0: 69 63 20 76 6f 69 64 20 6c 69 73 74 52 65 6d 6f  ic void listRemo
64d0: 76 65 28 50 61 67 65 72 4c 72 75 4c 69 73 74 20  ve(PagerLruList 
64e0: 2a 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72 75  *pList, PagerLru
64f0: 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48  Link *pLink, PgH
6500: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20  dr *pPg){.  int 
6510: 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70  iOff = (char *)p
6520: 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70  Link - (char *)p
6530: 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg;..#ifdef SQLI
6540: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
6550: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73  _MANAGEMENT.  as
6560: 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67  sert(pLink==&pPg
6570: 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d  ->free || pLink=
6580: 3d 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20  =&pPg->gfree);. 
6590: 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26   assert(pLink==&
65a0: 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c  pPg->gfree || pL
65b0: 69 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72 75  ist!=&sqlite3Lru
65c0: 50 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69  PageList);.#endi
65d0: 66 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c  f..  if( pPg==pL
65e0: 69 73 74 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20  ist->pFirst ){. 
65f0: 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74     pList->pFirst
6600: 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b   = pLink->pNext;
6610: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
6620: 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a  pList->pLast ){.
6630: 20 20 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74      pList->pLast
6640: 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b   = pLink->pPrev;
6650: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b  .  }.  if( pLink
6660: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 50  ->pPrev ){.    P
6670: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 50 72  agerLruLink *pPr
6680: 65 76 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c  evLink = (PagerL
6690: 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20  ruLink *)(&((u8 
66a0: 2a 29 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 29 5b  *)pLink->pPrev)[
66b0: 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70 50 72 65  iOff]);.    pPre
66c0: 76 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70  vLink->pNext = p
66d0: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  Link->pNext;.  }
66e0: 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 4e  .  if( pLink->pN
66f0: 65 78 74 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ext ){.    Pager
6700: 4c 72 75 4c 69 6e 6b 20 2a 70 4e 65 78 74 4c 69  LruLink *pNextLi
6710: 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69  nk = (PagerLruLi
6720: 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 4c  nk *)(&((u8 *)pL
6730: 69 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69 4f 66 66  ink->pNext)[iOff
6740: 5d 29 3b 0a 20 20 20 20 70 4e 65 78 74 4c 69 6e  ]);.    pNextLin
6750: 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 6e 6b  k->pPrev = pLink
6760: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
6770: 66 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70  f( pPg==pList->p
6780: 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
6790: 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 4c     PgHdr *p = pL
67a0: 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ink->pNext;.    
67b0: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
67c0: 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
67d0: 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70   PagerLruLink *p
67e0: 4c 20 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e  L = (PagerLruLin
67f0: 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70 29 5b  k *)(&((u8 *)p)[
6800: 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 70 20  iOff]);.      p 
6810: 3d 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  = pL->pNext;.   
6820: 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46   }.    pList->pF
6830: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
6840: 20 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e    }..  pLink->pN
6850: 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72  ext = pLink->pPr
6860: 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  ev = 0;.}../* .*
6870: 2a 20 41 64 64 20 70 61 67 65 20 70 50 67 20 74  * Add page pPg t
6880: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72  o the list of fr
6890: 65 65 20 70 61 67 65 73 20 66 6f 72 20 74 68 65  ee pages for the
68a0: 20 70 61 67 65 72 2e 20 49 66 20 0a 2a 2a 20 6d   pager. If .** m
68b0: 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74  emory-management
68c0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73   is enabled, als
68d0: 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74  o add the page t
68e0: 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 0a 2a 2a  o the global .**
68f0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61   list of free pa
6900: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ges..*/.static v
6910: 6f 69 64 20 6c 72 75 4c 69 73 74 41 64 64 28 50  oid lruListAdd(P
6920: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 6c 69  gHdr *pPg){.  li
6930: 73 74 41 64 64 28 26 70 50 67 2d 3e 70 50 61 67  stAdd(&pPg->pPag
6940: 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66  er->lru, &pPg->f
6950: 72 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65  ree, pPg);.#ifde
6960: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6970: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
6980: 54 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50  T.  if( !pPg->pP
6990: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
69a0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
69b0: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d  _enter(sqlite3_m
69c0: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
69d0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
69e0: 52 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 41 64  RU));.    listAd
69f0: 64 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67  d(&sqlite3LruPag
6a00: 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72  eList, &pPg->gfr
6a10: 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71  ee, pPg);.    sq
6a20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
6a30: 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e(sqlite3_mutex_
6a40: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
6a50: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6a60: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
6a70: 2a 20 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 61 67  * .** Remove pag
6a80: 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c  e pPg from the l
6a90: 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  ist of free page
6aa0: 73 20 66 6f 72 20 74 68 65 20 61 73 73 6f 63 69  s for the associ
6ab0: 61 74 65 64 20 70 61 67 65 72 2e 0a 2a 2a 20 49  ated pager..** I
6ac0: 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  f memory-managem
6ad0: 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ent is enabled, 
6ae0: 61 6c 73 6f 20 72 65 6d 6f 76 65 20 70 50 67 20  also remove pPg 
6af0: 66 72 6f 6d 20 74 68 65 20 67 6c 6f 62 61 6c 20  from the global 
6b00: 6c 69 73 74 0a 2a 2a 20 6f 66 20 66 72 65 65 20  list.** of free 
6b10: 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  pages..*/.static
6b20: 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 52 65 6d   void lruListRem
6b30: 6f 76 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ove(PgHdr *pPg){
6b40: 0a 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 70  .  listRemove(&p
6b50: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c  Pg->pPager->lru,
6b60: 20 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67   &pPg->free, pPg
6b70: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
6b80: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
6b90: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20  ANAGEMENT.  if( 
6ba0: 21 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65  !pPg->pPager->me
6bb0: 6d 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mDb ){.    sqlit
6bc0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
6bd0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
6be0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
6bf0: 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20  STATIC_LRU));.  
6c00: 20 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 73 71    listRemove(&sq
6c10: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6c20: 2c 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70  , &pPg->gfree, p
6c30: 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Pg);.    sqlite3
6c40: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
6c50: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
6c60: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
6c70: 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a  ATIC_LRU));.  }.
6c80: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  #endif.}../* .**
6c90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6ca0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 61 66  s called just af
6cb0: 74 65 72 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ter the needSync
6cc0: 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 63   flag has been c
6cd0: 6c 65 61 72 65 64 0a 2a 2a 20 66 72 6f 6d 20 61  leared.** from a
6ce0: 6c 6c 20 70 61 67 65 73 20 6d 61 6e 61 67 65 64  ll pages managed
6cf0: 20 62 79 20 70 50 61 67 65 72 20 28 75 73 75 61   by pPager (usua
6d00: 6c 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  lly because the 
6d10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
6d20: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 79  has just been sy
6d30: 6e 63 65 64 29 2e 20 49 74 20 75 70 64 61 74 65  nced). It update
6d40: 73 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6c 72  s the pPager->lr
6d50: 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 76  u.pFirstSynced v
6d60: 61 72 69 61 62 6c 65 0a 2a 2a 20 61 6e 64 2c 20  ariable.** and, 
6d70: 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65  if memory-manage
6d80: 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c  ment is enabled,
6d90: 20 74 68 65 20 73 71 6c 69 74 65 33 4c 72 75 50   the sqlite3LruP
6da0: 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79  ageList.pFirstSy
6db0: 6e 63 65 64 0a 2a 2a 20 76 61 72 69 61 62 6c 65  nced.** variable
6dc0: 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   also..*/.static
6dd0: 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 53 65 74   void lruListSet
6de0: 46 69 72 73 74 53 79 6e 63 65 64 28 50 61 67 65  FirstSynced(Page
6df0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 50  r *pPager){.  pP
6e00: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
6e10: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
6e20: 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a 23 69 66  >lru.pFirst;.#if
6e30: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6e40: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
6e50: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61 67 65  ENT.  if( !pPage
6e60: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
6e70: 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 73 71  PgHdr *p;.    sq
6e80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6e90: 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  r(sqlite3_mutex_
6ea0: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
6eb0: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6ec0: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
6ed0: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46  e3LruPageList.pF
6ee0: 69 72 73 74 3b 20 70 20 26 26 20 70 2d 3e 6e 65  irst; p && p->ne
6ef0: 65 64 53 79 6e 63 3b 20 70 3d 70 2d 3e 67 66 72  edSync; p=p->gfr
6f00: 65 65 2e 70 4e 65 78 74 29 3b 0a 20 20 20 20 61  ee.pNext);.    a
6f10: 73 73 65 72 74 28 70 3d 3d 70 50 61 67 65 72 2d  ssert(p==pPager-
6f20: 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
6f30: 64 20 7c 7c 20 70 3d 3d 73 71 6c 69 74 65 33 4c  d || p==sqlite3L
6f40: 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
6f50: 74 53 79 6e 63 65 64 29 3b 0a 20 20 20 20 73 71  tSynced);.    sq
6f60: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6f70: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  .pFirstSynced = 
6f80: 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  p;.    sqlite3_m
6f90: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
6fa0: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
6fb0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
6fc0: 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65  IC_LRU));.  }.#e
6fd0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
6fe0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 70 61 67  turn true if pag
6ff0: 65 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65 61  e *pPg has alrea
7000: 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
7010: 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
7020: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20  .** journal (or 
7030: 73 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73 68  statement snapsh
7040: 6f 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ot has been crea
7050: 74 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73 20  ted, if *pPg is 
7060: 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e  part.** of an in
7070: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
7080: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
7090: 20 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74   pageInStatement
70a0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
70b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
70c0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
70d0: 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
70e0: 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f  return PGHDR_TO_
70f0: 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
7100: 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c  )->inStmt;.  }el
7110: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  se{.    return s
7120: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
7130: 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
7140: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
7150: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
7160: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
7170: 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62  e pager hash tab
7180: 6c 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74  le to N.  N must
7190: 20 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f   be a power.** o
71a0: 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  f two..*/.static
71b0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69   void pager_resi
71c0: 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61  ze_hash_table(Pa
71d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
71e0: 20 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61   N){.  PgHdr **a
71f0: 48 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73  Hash, *pPg;.  as
7200: 73 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26  sert( N>0 && (N&
7210: 28 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 23 69 66  (N-1))==0 );.#if
7220: 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f  def SQLITE_MALLO
7230: 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 0a 20 20 69  C_SOFT_LIMIT.  i
7240: 66 28 20 4e 2a 73 69 7a 65 6f 66 28 61 48 61 73  f( N*sizeof(aHas
7250: 68 5b 30 5d 29 3e 53 51 4c 49 54 45 5f 4d 41 4c  h[0])>SQLITE_MAL
7260: 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54 20 29  LOC_SOFT_LIMIT )
7270: 7b 0a 20 20 20 20 4e 20 3d 20 53 51 4c 49 54 45  {.    N = SQLITE
7280: 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d  _MALLOC_SOFT_LIM
7290: 49 54 2f 73 69 7a 65 6f 66 28 61 48 61 73 68 5b  IT/sizeof(aHash[
72a0: 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  0]);.  }.  if( N
72b0: 3d 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20  ==pPager->nHash 
72c0: 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66  ) return;.#endif
72d0: 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
72e0: 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
72f0: 46 61 75 6c 74 42 65 6e 69 67 6e 28 53 51 4c 49  FaultBenign(SQLI
7300: 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52  TE_FAULTINJECTOR
7310: 5f 4d 41 4c 4c 4f 43 2c 20 70 50 61 67 65 72 2d  _MALLOC, pPager-
7320: 3e 61 48 61 73 68 21 3d 30 29 3b 0a 20 20 61 48  >aHash!=0);.  aH
7330: 61 73 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ash = sqlite3Mal
7340: 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
7350: 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20  aHash[0])*N );. 
7360: 20 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65 6e   sqlite3FaultBen
7370: 69 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54  ign(SQLITE_FAULT
7380: 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 2c  INJECTOR_MALLOC,
7390: 20 30 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65   0);.  pagerEnte
73a0: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
73b0: 20 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20   aHash==0 ){.   
73c0: 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72   /* Failure to r
73d0: 65 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20  ehash is not an 
73e0: 65 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e  error.  It is on
73f0: 6c 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ly a performance
7400: 20 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74   hit. */.    ret
7410: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
7420: 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
7430: 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72  aHash);.  pPager
7440: 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70  ->nHash = N;.  p
7450: 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 61  Pager->aHash = a
7460: 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d  Hash;.  for(pPg=
7470: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
7480: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
7490: 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68  tAll){.    int h
74a0: 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
74b0: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  gno==0 ){.      
74c0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
74d0: 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67  xtHash==0 && pPg
74e0: 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
74f0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
7500: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20  ;.    }.    h = 
7510: 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31  pPg->pgno & (N-1
7520: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
7530: 74 48 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d  tHash = aHash[h]
7540: 3b 0a 20 20 20 20 69 66 28 20 61 48 61 73 68 5b  ;.    if( aHash[
7550: 68 5d 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73  h] ){.      aHas
7560: 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20  h[h]->pPrevHash 
7570: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
7580: 20 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b   aHash[h] = pPg;
7590: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48  .    pPg->pPrevH
75a0: 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ash = 0;.  }.}..
75b0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
75c0: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
75d0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
75e0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
75f0: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
7600: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
7610: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
7620: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
7630: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
7640: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
7650: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
7660: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
7670: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
7680: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
7690: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
76a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
76b0: 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65  ead32bits(sqlite
76c0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
76d0: 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65  offset, u32 *pRe
76e0: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
76f0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74  har ac[4];.  int
7700: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
7710: 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65  ead(fd, ac, size
7720: 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b  of(ac), offset);
7730: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7740: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65  E_OK ){.    *pRe
7750: 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  s = sqlite3Get4b
7760: 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72  yte(ac);.  }.  r
7770: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7780: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
7790: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61  t integer into a
77a0: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69   string buffer i
77b0: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74  n big-endian byt
77c0: 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66  e order..*/.#def
77d0: 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c  ine put32bits(A,
77e0: 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62  B)  sqlite3Put4b
77f0: 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f  yte((u8*)A,B)../
7800: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
7810: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
7820: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
7830: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
7840: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
7850: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
7860: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
7870: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
7880: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
7890: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
78a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
78b0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
78c0: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
78d0: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
78e0: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
78f0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
7900: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
7910: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
7920: 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73 20   If file pFd is 
7930: 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74  open, call sqlit
7940: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20  e3OsUnlock() on 
7950: 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
7960: 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  t osUnlock(sqlit
7970: 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e  e3_file *pFd, in
7980: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20  t eLock){.  if( 
7990: 21 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  !pFd->pMethods )
79a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
79b0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
79c0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e  turn sqlite3OsUn
79d0: 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29  lock(pFd, eLock)
79e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
79f0: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
7a00: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
7a10: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
7a20: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
7a30: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
7a40: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
7a50: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
7a60: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
7a70: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
7a80: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
7a90: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
7aa0: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
7ab0: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
7ac0: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
7ad0: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
7ae0: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
7af0: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
7b00: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7b10: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
7b20: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
7b30: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
7b40: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
7b50: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
7b60: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
7b70: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
7b80: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
7b90: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
7ba0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
7bb0: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
7bc0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
7bd0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
7be0: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
7bf0: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
7c00: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
7c10: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
7c20: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
7c30: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
7c40: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
7c50: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
7c60: 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20  int dc;         
7c70: 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72    /* Device char
7c80: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
7c90: 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20   int nSector;   
7ca0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
7cb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
7cc0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ;        /* Page
7cd0: 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74   size */.  sqlit
7ce0: 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50  e3_file *fd = pP
7cf0: 61 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28  ager->fd;..  if(
7d00: 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b   fd->pMethods ){
7d10: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
7d20: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
7d30: 65 72 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20  eristics(fd);.  
7d40: 20 20 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69    nSector = sqli
7d50: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
7d60: 66 64 29 3b 0a 20 20 20 20 6e 50 61 67 65 20 3d  fd);.    nPage =
7d70: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7d80: 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  e;.  }..  assert
7d90: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
7da0: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
7db0: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c  ));.  assert(SQL
7dc0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
7dd0: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
7de0: 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d  ;..  if( !fd->pM
7df0: 65 74 68 6f 64 73 20 7c 7c 20 28 64 63 26 28 53  ethods || (dc&(S
7e00: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
7e10: 49 43 7c 28 6e 50 61 67 65 3e 3e 38 29 29 26 26  IC|(nPage>>8))&&
7e20: 6e 53 65 63 74 6f 72 3c 3d 6e 50 61 67 65 29 20  nSector<=nPage) 
7e30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f  ){.    return JO
7e40: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7e50: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
7e60: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
7e70: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
7e80: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
7e90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
7ea0: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ld be called whe
7eb0: 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  n an error occur
7ec0: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
7ed0: 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20  er.** code. The 
7ee0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
7ef0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
7f00: 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
7f10: 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e  re, the.** secon
7f20: 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  d the error-code
7f30: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
7f40: 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
7f50: 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a   API function. .
7f60: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
7f70: 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
7f80: 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
7f90: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
7fa0: 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
7fb0: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
7fc0: 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
7fd0: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
7fe0: 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54  ORRUPT, or SQLIT
7ff0: 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72  E_FULL.** the er
8000: 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73  ror becomes pers
8010: 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68  istent. Until th
8020: 65 20 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f  e persisten erro
8030: 72 20 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a  r is cleared,.**
8040: 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49 20   subsequent API 
8050: 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61  calls on this Pa
8060: 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61  ger will immedia
8070: 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  tely return the 
8080: 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63  same .** error c
8090: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72  ode..**.** A per
80a0: 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e  sistent error in
80b0: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
80c0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
80d0: 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a   pager-cache .**
80e0: 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
80f0: 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63  ed. This state c
8100: 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  an be cleared by
8110: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63   completely disc
8120: 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63  arding .** the c
8130: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
8140: 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61  ager-cache. If a
8150: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
8160: 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20   active when.** 
8170: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65  the persistent e
8180: 72 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68  rror occured, th
8190: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
81a0: 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
81b0: 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
81c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
81d0: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
81e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a  Pager *pPager);.
81f0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
8200: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
8210: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
8220: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
8230: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
8240: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
8250: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
8260: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
8270: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
8280: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
8290: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
82a0: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
82b0: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
82c0: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
82d0: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
82e0: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
82f0: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
8300: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
8310: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
8320: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
8330: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
8340: 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
8350: 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   && pPager->nRef
8360: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
8370: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
8380: 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64  already unlocked
8390: 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c  , call pager_unl
83a0: 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20  ock() now to.   
83b0: 20 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20     ** clear the 
83c0: 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
83d0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
83e0: 70 61 67 65 72 2d 63 61 63 68 65 20 69 73 20 0a  pager-cache is .
83f0: 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74        ** complet
8400: 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20 20  ely empty..     
8410: 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f   */.      pager_
8420: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
8430: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8440: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
8450: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
8460: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
8470: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
8480: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8490: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
84a0: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
84b0: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
84c0: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
84d0: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
84e0: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
84f0: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
8500: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
8510: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
8520: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
8530: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
8540: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
8550: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
8560: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
8570: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
8580: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
8590: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
85a0: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
85b0: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
85c0: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
85d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
85e0: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
85f0: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
8600: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
8610: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
8620: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
8630: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
8640: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
8650: 20 20 20 20 20 20 20 20 20 20 28 75 6e 73 69 67            (unsig
8660: 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44 52  ned char *)PGHDR
8670: 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29 29  _TO_DATA(pPage))
8680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
8690: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
86a0: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
86b0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
86c0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
86d0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
86e0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
86f0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
8700: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
8710: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
8720: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
8730: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
8740: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
8750: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
8760: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
8770: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
8780: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
8790: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
87a0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
87b0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
87c0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
87d0: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
87e0: 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67  pageHash || pPag
87f0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d  er->errCode || M
8800: 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72  EMDB || pPg->dir
8810: 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67  ty || .      pPg
8820: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
8830: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
8840: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
8850: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
8860: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
8870: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
8880: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
8890: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
88a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ndif../*.** When
88b0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
88c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
88d0: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
88e0: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
88f0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
8900: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
8910: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
8920: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
8930: 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e   and .** written
8940: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70   into memory sup
8950: 70 6c 69 65 64 20 62 79 20 74 68 65 20 63 61 6c  plied by the cal
8960: 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  ler. .**.** zMas
8970: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
8980: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
8990: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
89a0: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
89b0: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
89c0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
89d0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
89e0: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
89f0: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
8a00: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
8a10: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
8a20: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
8a30: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
8a40: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
8a50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8a60: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
8a70: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
8a80: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
8a90: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
8aa0: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
8ab0: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
8ac0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
8ad0: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
8ae0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
8af0: 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20  ** If no master 
8b00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
8b10: 65 20 69 73 20 70 72 65 73 65 6e 74 20 7a 4d 61  e is present zMa
8b20: 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74  ster[0] is set t
8b30: 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  o 0 and.** SQLIT
8b40: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
8b50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
8b60: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73  dMasterJournal(s
8b70: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72  qlite3_file *pJr
8b80: 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nl, char *zMaste
8b90: 72 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b  r, int nMaster){
8ba0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
8bb0: 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b   len;.  i64 szJ;
8bc0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20  .  u32 cksum;.  
8bd0: 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65  int i;.  unsigne
8be0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
8bf0: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
8c00: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
8c10: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61  header */..  zMa
8c20: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
8c30: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8c40: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
8c50: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
8c60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
8c70: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
8c80: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
8c90: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
8ca0: 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  -16, &len);.  if
8cb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8cc0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
8cd0: 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72  if( len>=nMaster
8ce0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8cf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
8d00: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
8d10: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
8d20: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
8d30: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8d40: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8d50: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
8d60: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
8d70: 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20  , szJ-8);.  if( 
8d80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
8d90: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
8da0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
8db0: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
8dc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8dd0: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
8de0: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
8df0: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
8e00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8e10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
8e20: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
8e30: 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65  = '\0';..  /* Se
8e40: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
8e50: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
8e60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
8e70: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
8e80: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
8e90: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
8ea0: 72 5b 69 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28  r[i];.   }.  if(
8eb0: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
8ec0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
8ed0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
8ee0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
8ef0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
8f00: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
8f10: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
8f20: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
8f30: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
8f40: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
8f50: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
8f60: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
8f70: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
8f80: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
8f90: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
8fa0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
8fb0: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
8fc0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
8fd0: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
8fe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8ff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
9000: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
9010: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
9020: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
9030: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
9040: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9050: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
9060: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
9070: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
9080: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
9090: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
90a0: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
90b0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
90c0: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
90d0: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
90e0: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
90f0: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
9120: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
9130: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
9140: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
9150: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
9160: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
9170: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
9180: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
9190: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
91a0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  .** .*/.static v
91b0: 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  oid seekJournalH
91c0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
91d0: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
91e0: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
91f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9200: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
9210: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
9220: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
9230: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
9240: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9250: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
9260: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
9270: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
9280: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
9290: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
92a0: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
92b0: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
92c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
92d0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
92e0: 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d  lOff = offset;.}
92f0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a 65  ../*.** Write ze
9300: 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68 65 61  ros over the hea
9310: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
9320: 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 68  al file.  This h
9330: 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65 63 74  as the.** effect
9340: 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69 6e 67   of invalidating
9350: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9360: 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e 67  e and committing
9370: 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
9380: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
9390: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
93a0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
93b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  {.  int rc;.  st
93c0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
93d0: 7a 65 72 6f 48 64 72 5b 32 38 5d 3b 0a 0a 20 20  zeroHdr[28];..  
93e0: 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48  IOTRACE(("JZEROH
93f0: 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  DR %p\n", pPager
9400: 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  )).  rc = sqlite
9410: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
9420: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
9430: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
9440: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
9450: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
9460: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
9470: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
9480: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
9490: 4e 4c 59 20 7c 20 70 50 61 67 65 72 2d 3e 73 79  NLY | pPager->sy
94a0: 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
94b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
94c0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
94d0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
94e0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
94f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
9500: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
9510: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
9520: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
9530: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
9540: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
9550: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
9560: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
9570: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
9580: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9590: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
95a0: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
95b0: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
95c0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
95d0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
95e0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
95f0: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
9600: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
9610: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
9620: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
9630: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
9640: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
9650: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
9660: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
9670: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
9680: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
9690: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
96a0: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
96b0: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
96c0: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
96d0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
96e0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
96f0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
9700: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
9710: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
9720: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
9730: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
9740: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
9750: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
9760: 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70  har *zHeader = p
9770: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
9780: 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 20  ;.  int nHeader 
9790: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
97a0: 7a 65 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65  ze;.  int nWrite
97b0: 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  ;..  if( nHeader
97c0: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
97d0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
97e0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
97f0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
9800: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
9810: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d  er->stmtHdrOff==
9820: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
9830: 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50  >stmtHdrOff = pP
9840: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9850: 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75  ;.  }..  seekJou
9860: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
9870: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
9880: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
9890: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d  journalOff;..  m
98a0: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
98b0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
98c0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
98d0: 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ic));..  /* .  *
98e0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
98f0: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
9900: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
9910: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
9920: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
9930: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
9940: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
9950: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
9960: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
9970: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
9980: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
9990: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
99a0: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
99b0: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
99c0: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
99d0: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
99e0: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
99f0: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
9a00: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
9a10: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
9a20: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
9a30: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
9a40: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
9a50: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
9a60: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
9a70: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
9a80: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
9a90: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
9aa0: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
9ab0: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
9ac0: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
9ad0: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
9ae0: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
9af0: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
9b00: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
9b10: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
9b20: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 20  failure occured 
9b30: 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74  whilst writing t
9b40: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
9b50: 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63  ** file it may c
9b60: 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62  ontain some garb
9b70: 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20  age data. There 
9b80: 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  are two scenario
9b90: 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69  s.  ** where thi
9ba0: 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67  s risk can be ig
9bb0: 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nored:.  **.  **
9bc0: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61     * When the pa
9bd0: 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ger is in no-syn
9be0: 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69  c mode. Corrupti
9bf0: 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a  on can follow a.
9c00: 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66    **     power f
9c10: 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63  ailure in this c
9c20: 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a  ase anyway..  **
9c30: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
9c40: 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  he SQLITE_IOCAP_
9c50: 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67  SAFE_APPEND flag
9c60: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75   is set. This gu
9c70: 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20  arantees.  **   
9c80: 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64    that garbage d
9c90: 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70  ata is never app
9ca0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  ended to the jou
9cb0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  rnal file..  */.
9cc0: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
9cd0: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
9ce0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a  Pager->noSync);.
9cf0: 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e    if( (pPager->n
9d00: 6f 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28 73  oSync) .   || (s
9d10: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
9d20: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
9d30: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
9d40: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
9d50: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75  ND) .  ){.    pu
9d60: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
9d70: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
9d80: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
9d90: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
9da0: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
9db0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
9dc0: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29  urnalMagic)], 0)
9dd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
9de0: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
9df0: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
9e00: 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   .  sqlite3_rand
9e10: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
9e20: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
9e30: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
9e40: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
9e50: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
9e60: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
9e70: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
9e80: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
9e90: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
9ea0: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
9eb0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
9ec0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
9ed0: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
9ee0: 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a  r->dbSize);.  /*
9ef0: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
9f00: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
9f10: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
9f20: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
9f30: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
9f40: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
9f50: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
9f60: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
9f70: 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30 20 29 7b  journalHdr==0 ){
9f80: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
9f90: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 70 75 74   size */.    put
9fa0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
9fb0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9fc0: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
9fd0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9fe0: 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d  }..  for(nWrite=
9ff0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
a000: 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c  &&nWrite<JOURNAL
a010: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
a020: 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72   nWrite+=nHeader
a030: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
a040: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
a050: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
a060: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
a070: 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72   nHeader)).    r
a080: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
a090: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
a0a0: 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72  zHeader, nHeader
a0b0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
a0c0: 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65  lOff);.    pPage
a0d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
a0e0: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
a0f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a100: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
a110: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
a120: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
a130: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
a140: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
a150: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
a160: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
a170: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
a180: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
a190: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
a1a0: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
a1b0: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
a1c0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
a1d0: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
a1e0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  n of.** the jour
a1f0: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
a200: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
a210: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
a220: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52  uccessfully, *nR
a230: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
a240: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
a250: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
a260: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
a270: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20   and *dbSize is 
a280: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
a290: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
a2a0: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
a2b0: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
a2c0: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
a2d0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
a2e0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
a2f0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
a300: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a310: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
a320: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
a330: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
a340: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
a350: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
a360: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
a370: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
a380: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
a390: 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e  ned and *nRec an
a3a0: 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f  d *dbSize are no
a3b0: 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e  t set.  If JOURN
a3c0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
a3d0: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
a3e0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a3f0: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
a400: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
a410: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
a420: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
a430: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
a440: 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  , .  i64 journal
a450: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
a460: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
a470: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
a480: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a490: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
a4a0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
a4b0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
a4c0: 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66   */.  i64 jrnlOf
a4d0: 66 3b 0a 20 20 69 6e 74 20 69 50 61 67 65 53 69  f;.  int iPageSi
a4e0: 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e  ze;..  seekJourn
a4f0: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
a500: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
a510: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
a520: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
a530: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
a540: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a550: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72  E_DONE;.  }.  jr
a560: 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  nlOff = pPager->
a570: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72  journalOff;..  r
a580: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
a590: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
a5a0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
a5b0: 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b  agic), jrnlOff);
a5c0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
a5d0: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
a5e0: 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67 69   += sizeof(aMagi
a5f0: 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d  c);..  if( memcm
a600: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
a610: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
a620: 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
a630: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a640: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63  _DONE;.  }..  rc
a650: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
a660: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
a670: 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66  ff, pNRec);.  if
a680: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a690: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
a6a0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a6b0: 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50  , jrnlOff+4, &pP
a6c0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
a6d0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
a6e0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
a6f0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
a700: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
a710: 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69  8, pDbSize);.  i
a720: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a730: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
a740: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
a750: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20 28  d, jrnlOff+16, (
a760: 75 33 32 20 2a 29 26 69 50 61 67 65 53 69 7a 65  u32 *)&iPageSize
a770: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
a780: 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 69 50  ITE_OK .   && iP
a790: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 0a 20 20  ageSize>=512 .  
a7a0: 20 26 26 20 69 50 61 67 65 53 69 7a 65 3c 3d 53   && iPageSize<=S
a7b0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
a7c0: 49 5a 45 20 0a 20 20 20 26 26 20 28 28 69 50 61  IZE .   && ((iPa
a7d0: 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
a7e0: 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20  ize)==0 .  ){.  
a7f0: 20 20 75 31 36 20 70 61 67 65 73 69 7a 65 20 3d    u16 pagesize =
a800: 20 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20   iPageSize;.    
a810: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
a820: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
a830: 67 65 72 2c 20 26 70 61 67 65 73 69 7a 65 29 3b  ger, &pagesize);
a840: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20  .  }.  if( rc ) 
a850: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
a860: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
a870: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
a880: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
a890: 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  ue used by .  **
a8a0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
a8b0: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
a8c0: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
a8d0: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a  journal was.  **
a8e0: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
a8f0: 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
a900: 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
a910: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a  this routine.  *
a920: 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
a930: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
a940: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
a950: 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
a960: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
a970: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
a980: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
a990: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
a9a0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
a9b0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
a9c0: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c  jfd, jrnlOff+12,
a9d0: 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d   (u32 *)&pPager-
a9e0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
a9f0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
aa00: 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a  rc;..  pPager->j
aa10: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
aa20: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
aa30: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
aa40: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
aa50: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
aa60: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
aa70: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
aa80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
aa90: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
aaa0: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
aab0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
aac0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
aad0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
aae0: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
aaf0: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
ab00: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
ab10: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
ab20: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
ab30: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
ab40: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
ab50: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
ab60: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
ab70: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
ab80: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
ab90: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
aba0: 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65  :.**.** + 4 byte
abb0: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
abc0: 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20  ..** + N bytes: 
abd0: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
abe0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
abf0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a  * + 4 bytes: N.*
ac00: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73  * + 4 bytes: Mas
ac10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
ac20: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20   checksum..** + 
ac30: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
ac40: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
ac50: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
ac60: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
ac70: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
ac80: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
ac90: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
aca0: 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  l name..**.** If
acb0: 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55   zMaster is a NU
acc0: 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75  LL pointer (occu
acd0: 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  rs for a single 
ace0: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
acf0: 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20  tion), .** this 
ad00: 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
ad10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
ad20: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
ad30: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
ad40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
ad50: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
ad60: 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69  .  int len; .  i
ad70: 6e 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e  nt i; .  i64 jrn
ad80: 6c 4f 66 66 3b 0a 20 20 75 33 32 20 63 6b 73 75  lOff;.  u32 cksu
ad90: 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  m = 0;.  char zB
ada0: 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  uf[sizeof(aJourn
adb0: 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a  alMagic)+2*4];..
adc0: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
add0: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
ade0: 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ter) return SQLI
adf0: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d  TE_OK;.  pPager-
ae00: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
ae10: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
ae20: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28  zMaster);.  for(
ae30: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
ae40: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
ae50: 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a  Master[i];.  }..
ae60: 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
ae70: 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
ae80: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
ae90: 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
aea0: 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
aeb0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
aec0: 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
aed0: 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
aee0: 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
aef0: 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
af00: 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
af10: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
af20: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
af30: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
af40: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
af50: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
af60: 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
af70: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
af80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
af90: 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a  ff += (len+20);.
afa0: 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
afb0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
afc0: 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f   jrnlOff, PAGER_
afd0: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
afe0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
aff0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
b000: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
b010: 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  4;..  rc = sqlit
b020: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
b030: 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
b040: 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  len, jrnlOff);. 
b050: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b060: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
b070: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e    jrnlOff += len
b080: 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a  ;..  put32bits(z
b090: 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74  Buf, len);.  put
b0a0: 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c  32bits(&zBuf[4],
b0b0: 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70   cksum);.  memcp
b0c0: 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75  y(&zBuf[8], aJou
b0d0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
b0e0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
b0f0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
b100: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
b110: 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69  >jfd, zBuf, 8+si
b120: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
b130: 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  ic), jrnlOff);. 
b140: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
b150: 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
b160: 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ync;.  return rc
b170: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f  ;.}../*.** Add o
b180: 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20  r remove a page 
b190: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
b1a0: 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20   all pages that 
b1b0: 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74  are in the.** st
b1c0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
b1d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
b1e0: 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74   keeps a separat
b1f0: 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
b200: 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
b210: 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61  ly in.** the sta
b220: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
b230: 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20   This helps the 
b240: 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
b250: 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74  Commit().** rout
b260: 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73  ine run MUCH fas
b270: 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  ter for the comm
b280: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
b290: 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20  ere are many.** 
b2a0: 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20  pages in memory 
b2b0: 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61  but only a few a
b2c0: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
b2d0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ent journal..*/.
b2e0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
b2f0: 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
b300: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
b310: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
b320: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
b330: 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
b340: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
b350: 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
b360: 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 20 29   assert( MEMDB )
b370: 3b 0a 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e  ;.  if( !pHist->
b380: 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  inStmt ){.    as
b390: 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 50 72  sert( pHist->pPr
b3a0: 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 48 69  evStmt==0 && pHi
b3b0: 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30  st->pNextStmt==0
b3c0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
b3d0: 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  er->pStmt ){.   
b3e0: 20 20 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54     PGHDR_TO_HIST
b3f0: 28 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20  (pPager->pStmt, 
b400: 70 50 61 67 65 72 29 2d 3e 70 50 72 65 76 53 74  pPager)->pPrevSt
b410: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  mt = pPg;.    }.
b420: 20 20 20 20 70 48 69 73 74 2d 3e 70 4e 65 78 74      pHist->pNext
b430: 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  Stmt = pPager->p
b440: 53 74 6d 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Stmt;.    pPager
b450: 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20  ->pStmt = pPg;. 
b460: 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
b470: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
b480: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
b490: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
b4a0: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
b4b0: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
b4c0: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
b4d0: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
b4e0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
b4f0: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
b500: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
b510: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
b520: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
b530: 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  *p;.  if( pPager
b540: 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74  ->aHash==0 ) ret
b550: 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61  urn 0;.  p = pPa
b560: 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20  ger->aHash[pgno 
b570: 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
b580: 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  -1)];.  while( p
b590: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
b5a0: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
b5b0: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
b5c0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
b5d0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69 6e  .** Clear the in
b5e0: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
b5f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
b600: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
b610: 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  f the pager back
b620: 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20   to what it was 
b630: 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73  when it was firs
b640: 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e  t.** opened.  An
b650: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
b660: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
b670: 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ted and subseque
b680: 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  nt attempts.** t
b690: 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70  o access those p
b6a0: 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ages will likely
b6b0: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
b6c0: 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  edump..*/.static
b6d0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
b6e0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
b6f0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20  {.  PgHdr *pPg, 
b700: 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50  *pNext;.  if( pP
b710: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
b720: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50  return;.  for(pP
b730: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
b740: 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
b750: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50  .    IOTRACE(("P
b760: 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20  GFREE %p %d\n", 
b770: 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
b780: 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  o));.    PAGER_I
b790: 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
b7a0: 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b  r_pgfree_count);
b7b0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
b7c0: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
b7d0: 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50  lruListRemove(pP
b7e0: 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
b7f0: 66 72 65 65 28 70 50 67 2d 3e 70 44 61 74 61 29  free(pPg->pData)
b800: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
b810: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 61  ee(pPg);.  }.  a
b820: 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72  ssert(pPager->lr
b830: 75 2e 70 46 69 72 73 74 3d 3d 30 29 3b 0a 20 20  u.pFirst==0);.  
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 53 79 6e 63 65 64 3d  ru.pFirstSynced=
b860: 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  =0);.  assert(pP
b870: 61 67 65 72 2d 3e 6c 72 75 2e 70 4c 61 73 74 3d  ager->lru.pLast=
b880: 3d 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  =0);.  pPager->p
b890: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Stmt = 0;.  pPag
b8a0: 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20  er->pAll = 0;.  
b8b0: 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
b8c0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48   0;.  pPager->nH
b8d0: 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ash = 0;.  sqlit
b8e0: 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
b8f0: 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72  aHash);.  pPager
b900: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70  ->nPage = 0;.  p
b910: 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 30  Pager->aHash = 0
b920: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
b930: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   = 0;.}../*.** U
b940: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
b950: 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
b960: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
b970: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72  currently in err
b980: 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61 72  or state, discar
b990: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
b9a0: 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  f .** the cache 
b9b0: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 61  and reset the Pa
b9c0: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69 6e  ger structure in
b9d0: 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66  ternal state. If
b9e0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
b9f0: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c  open journal-fil
ba00: 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74  e, then the next
ba10: 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c   time a shared-l
ba20: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ock is obtained.
ba30: 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ** on the pager 
ba40: 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72  file (by this or
ba50: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
ba60: 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a  ss), it will be.
ba70: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61 20  ** treated as a 
ba80: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
ba90: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
baa0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
bab0: 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
bac0: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
bad0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
bae0: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  eMode ){.    if(
baf0: 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
bb00: 20 69 6e 74 20 72 63 20 3d 20 6f 73 55 6e 6c 6f   int rc = osUnlo
bb10: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
bb20: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  O_LOCK);.      i
bb30: 66 28 20 72 63 20 29 20 70 50 61 67 65 72 2d 3e  f( rc ) pPager->
bb40: 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
bb50: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
bb60: 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49  ze = -1;.      I
bb70: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
bb80: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
bb90: 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  .      /* Always
bba0: 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
bbb0: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f  al file when dro
bbc0: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pping the databa
bbd0: 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  se lock..      *
bbe0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f  * Otherwise, ano
bbf0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
bc00: 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
bc10: 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20  e=delete might. 
bc20: 20 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74       ** delete t
bc30: 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d  he file out from
bc40: 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 20   under us..     
bc50: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
bc60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
bc70: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  n ){.        sql
bc80: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
bc90: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
bca0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
bcb0: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  lOpen = 0;.     
bcc0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
bcd0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
bce0: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
bcf0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e       pPager->pIn
bd00: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
bd10: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
bd20: 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
bd30: 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
bd40: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
bd50: 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
bd60: 65 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 73 74  e.      ** trust
bd70: 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
bd80: 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75   pager file is u
bd90: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e  nlocked, the con
bda0: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20  tents of the.   
bdb0: 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20     ** cache can 
bdc0: 62 65 20 64 69 73 63 61 72 64 65 64 20 61 6e 64  be discarded and
bdd0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
bde0: 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a  safely cleared..
bdf0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
be00: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
be10: 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  de ){.        if
be20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
be30: 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ) pPager->errCod
be40: 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
be50: 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
be60: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
be70: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
be80: 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
be90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
bea0: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66  lose(pPager->stf
beb0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  d);.          sq
bec0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
bed0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  oy(pPager->pInSt
bee0: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
bef0: 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d  Pager->pInStmt =
bf00: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
bf10: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
bf20: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  mtOpen = 0;.    
bf30: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
bf40: 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 20  InUse = 0;.     
bf50: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
bf60: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
bf70: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
bf80: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
bf90: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
bfa0: 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
bfb0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
bfc0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
bfd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
bfe0: 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 7c      if( !MEMDB |
bff0: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
c000: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
c010: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
c020: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
c030: 43 4b 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  CK;.      pPager
c040: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
c050: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
c060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
c070: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20  e a rollback if 
c080: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
c090: 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f   active and unlo
c0a0: 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ck the .** datab
c0b0: 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
c0c0: 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
c0d0: 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
c0e0: 72 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20  rror state, .** 
c0f0: 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
c100: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he rollback..*/.
c110: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
c120: 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
c130: 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  ck(Pager *p){.  
c140: 2f 2a 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74  /* assert( p->st
c150: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
c160: 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61  VED || p->journa
c170: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 20 2a 2f 0a 20  lOpen==0 ); */. 
c180: 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d   if( p->errCode=
c190: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
c1a0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
c1b0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
c1c0: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
c1d0: 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61 67  ck(p);.  }.  pag
c1e0: 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 23 69  er_unlock(p);.#i
c1f0: 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 2d  f 0.  assert( p-
c200: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e  >errCode || !p->
c210: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28  journalOpen || (
c220: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
c230: 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  &&!p->journalOff
c240: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
c250: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d  ->errCode || !p-
c260: 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e  >stmtOpen || p->
c270: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b  exclusiveMode );
c280: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
c290: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
c2a0: 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
c2b0: 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  A transaction
c2c0: 20 69 73 20 65 6e 64 65 64 20 62 79 20 65 69 74   is ended by eit
c2d0: 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20  her.** a COMMIT 
c2e0: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a  or a ROLLBACK..*
c2f0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
c300: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
c310: 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  , the pager has 
c320: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c330: 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52   open and.** a R
c340: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
c350: 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
c360: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
c370: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
c380: 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74  lease.** the dat
c390: 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61  abase lock and a
c3a0: 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44  cquires a SHARED
c3b0: 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61   lock in its pla
c3c0: 63 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a  ce if that is.**
c3d0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
c3e0: 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52   thing to do.  R
c3f0: 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75  elease locks usu
c400: 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69  ally is appropri
c410: 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77  ate,.** unless w
c420: 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69  e are in exclusi
c430: 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f  ve access mode o
c440: 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73  r unless this is
c450: 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e   a .** COMMIT AN
c460: 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42  D BEGIN or ROLLB
c470: 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70  ACK AND BEGIN op
c480: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  eration..**.** T
c490: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c4a0: 69 73 20 65 69 74 68 65 72 20 64 65 6c 65 74 65  is either delete
c4b0: 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a  d or truncated..
c4c0: 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73  **.** TODO: Cons
c4d0: 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65  ider keeping the
c4e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
c4f0: 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  en for temporary
c500: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54   databases..** T
c510: 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61  his might give a
c520: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70   performance imp
c530: 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64  rovement on wind
c540: 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e  ows where openin
c550: 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61  g.** a file is a
c560: 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72  n expensive oper
c570: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
c580: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
c590: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
c5a0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
c5b0: 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
c5c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c5d0: 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
c5e0: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
c5f0: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
c600: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
c610: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
c620: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c630: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
c640: 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
c650: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
c660: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
c670: 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65  en && !pPager->e
c680: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
c690: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
c6a0: 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  se(pPager->stfd)
c6b0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
c6c0: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  mtOpen = 0;.  }.
c6d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
c6e0: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
c6f0: 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 65 78   if( (pPager->ex
c700: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 0a 20  clusiveMode ||. 
c710: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c720: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
c730: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
c740: 45 52 53 49 53 54 29 20 0a 20 20 20 20 20 20 20  ERSIST) .       
c750: 26 26 20 28 72 63 20 3d 20 7a 65 72 6f 4a 6f 75  && (rc = zeroJou
c760: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 29  rnalHdr(pPager))
c770: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c780: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c790: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
c7a0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c7b0: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
c7c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c7d0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
c7e0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
c7f0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
c800: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  alOpen = 0;.    
c810: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c820: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
c830: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
c840: 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
c850: 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
c860: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
c870: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
c880: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
c890: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
c8a0: 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
c8b0: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
c8c0: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
c8d0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
c8e0: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
c8f0: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  ){.      pPg->in
c900: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
c910: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
c920: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
c930: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
c940: 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
c950: 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65  lback = 0;.#ifde
c960: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c970: 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e  AGES.      pPg->
c980: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c990: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
c9a0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
c9b0: 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
c9c0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
c9d0: 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
c9e0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
c9f0: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
ca00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
ca10: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
ca20: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  0 );.  }..  if( 
ca30: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
ca40: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  veMode ){.    rc
ca50: 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  2 = osUnlock(pPa
ca60: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
ca70: 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
ca80: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
ca90: 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65  _SHARED;.  }else
caa0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
cab0: 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
cac0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
cad0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
cae0: 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70  CLUSIVE;.  }.  p
caf0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
cb00: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
cb10: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
cb20: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
cb30: 6e 63 20 3d 20 30 3b 0a 20 20 6c 72 75 4c 69 73  nc = 0;.  lruLis
cb40: 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28  tSetFirstSynced(
cb50: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
cb60: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
cb70: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
cb80: 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
cb90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
cba0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
cbb0: 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
cbc0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a   page of data..*
cbd0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
cbe0: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
cbf0: 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  .  It is really 
cc00: 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
cc10: 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
cc20: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64  nitial value and
cc30: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
cc40: 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74  .  We experiment
cc50: 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65  ed with.** a che
cc60: 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74  cksum of the ent
cc70: 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68  ire data, but th
cc80: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
cc90: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a  be too slow..**.
cca0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
ccb0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
ccc0: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65  stored at the be
ccd0: 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
cce0: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b  and.** the check
ccf0: 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74  sum is stored at
cd00: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20   the end.  This 
cd10: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49  is important.  I
cd20: 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72  f journal.** cor
cd30: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
cd40: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
cd50: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
cd60: 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a  likely scenario.
cd70: 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  ** is that one e
cd80: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
cd90: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
cda0: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  ll be changed.  
cdb0: 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65  It is.** much le
cdc0: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
cdd0: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
cde0: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
cdf0: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
ce00: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
ce10: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
ce20: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
ce30: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
ce40: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
ce50: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
ce60: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
ce70: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
ce80: 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49  uption..**.** FI
ce90: 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20  X ME:  Consider 
cea0: 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30  adding every 200
ceb0: 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20  th (or so) byte 
cec0: 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  of the data to t
ced0: 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20  he.** checksum. 
cee0: 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73   That way if a s
cef0: 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73  ingle page spans
cf00: 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20   3 or more disk 
cf10: 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f  sectors and.** o
cf20: 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73  nly the middle s
cf30: 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74  ector is corrupt
cf40: 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  , we will still 
cf50: 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c  have a reasonabl
cf60: 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66  e.** chance of f
cf70: 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b  ailing the check
cf80: 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74  sum and thus det
cf90: 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  ecting the probl
cfa0: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  em..*/.static u3
cfb0: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
cfc0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
cfd0: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
cfe0: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
cff0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
d000: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
d010: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a  ->pageSize-200;.
d020: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
d030: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
d040: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
d050: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
d060: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46  n cksum;.}../* F
d070: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
d080: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on */.static voi
d090: 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
d0a0: 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r*);../*.** Read
d0b0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
d0c0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
d0d0: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
d0e0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
d0f0: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
d100: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
d110: 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75  **.** If useCksu
d120: 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  m==0 it means th
d130: 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  is journal does 
d140: 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d  not use checksum
d150: 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a  s.  Checksums.**
d160: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
d170: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
d180: 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74  als because stat
d190: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64  ement journals d
d1a0: 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f  o not.** need to
d1b0: 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66   survive power f
d1c0: 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74  ailures..*/.stat
d1d0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
d1e0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
d1f0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
d200: 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   .  sqlite3_file
d210: 20 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f 66 66   *jfd,.  i64 off
d220: 73 65 74 2c 0a 20 20 69 6e 74 20 75 73 65 43 6b  set,.  int useCk
d230: 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  sum.){.  int rc;
d240: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
d270: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
d280: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
d290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d2a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
d2b0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
d2c0: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
d2d0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
d300: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
d310: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44  king */.  u8 *aD
d320: 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67  ata = (u8 *)pPag
d330: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20  er->pTmpSpace;  
d340: 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
d350: 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a   for a page */..
d360: 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68    /* useCksum sh
d370: 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72  ould be true for
d380: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
d390: 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a  l and false for.
d3a0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a    ** statement j
d3b0: 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79  ournals.  Verify
d3c0: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c   that this is al
d3d0: 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20  ways the case.  
d3e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64  */.  assert( jfd
d3f0: 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20   == (useCksum ? 
d400: 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
d410: 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20  ager->stfd) );. 
d420: 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
d430: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
d440: 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74  bits(jfd, offset
d450: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
d460: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
d470: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
d480: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
d490: 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  jfd, aData, pPag
d4a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
d4b0: 66 73 65 74 2b 34 29 3b 0a 20 20 69 66 28 20 72  fset+4);.  if( r
d4c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
d4d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67  eturn rc;.  pPag
d4e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
d4f0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
d500: 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61  ze + 4;..  /* Sa
d510: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
d520: 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
d530: 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
d540: 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
d550: 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
d560: 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
d570: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
d580: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
d590: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
d5a0: 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
d5b0: 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
d5c0: 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
d5d0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
d5e0: 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
d5f0: 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
d600: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
d610: 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
d620: 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
d630: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
d640: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
d650: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
d660: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
d670: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
d680: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
d690: 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
d6a0: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
d6b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d6c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43  ;.  }.  if( useC
d6d0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  ksum ){.    rc =
d6e0: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
d6f0: 20 6f 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e   offset+pPager->
d700: 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73  pageSize+4, &cks
d710: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
d720: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
d730: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d740: 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66  Off += 4;.    if
d750: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
d760: 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b  ager, aData)!=ck
d770: 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
d780: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
d790: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
d7a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
d7b0: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
d7c0: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
d7d0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
d7e0: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
d7f0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
d800: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
d810: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
d820: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
d830: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
d840: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
d850: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
d860: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
d870: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
d880: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
d890: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
d8a0: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
d8b0: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
d8c0: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
d8d0: 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
d8e0: 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
d8f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
d900: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
d910: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
d920: 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
d930: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
d940: 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
d950: 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
d960: 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
d970: 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
d980: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
d990: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
d9a0: 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
d9b0: 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
d9c0: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
d9d0: 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
d9e0: 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
d9f0: 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
da00: 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
da10: 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
da20: 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
da30: 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
da40: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
da50: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
da60: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
da70: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
da80: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
da90: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
daa0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
dab0: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
dac0: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
dad0: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
dae0: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
daf0: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
db00: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
db10: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
db20: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
db30: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
db40: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
db50: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
db60: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
db70: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
db80: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
db90: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
dba0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
dbb0: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
dbc0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
dbd0: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
dbe0: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
dbf0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
dc00: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
dc10: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
dc20: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
dc30: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
dc40: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
dc50: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
dc60: 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
dc70: 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
dc80: 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
dc90: 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
dca0: 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
dcb0: 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
dcc0: 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
dcd0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
dce0: 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
dcf0: 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
dd00: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
dd10: 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
dd20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
dd30: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
dd40: 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
dd50: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
dd60: 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
dd70: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
dd80: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
dd90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
dda0: 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
ddb0: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
ddc0: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
ddd0: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
dde0: 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
ddf0: 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
de00: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
de10: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
de20: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
de30: 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
de40: 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
de50: 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
de60: 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30    **.  ** 2008-0
de70: 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65  4-14:  When atte
de80: 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d  mpting to vacuum
de90: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
dea0: 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a  ase file, it.  *
deb0: 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
dec0: 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e   fail a statemen
ded0: 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  t on a database 
dee0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65  that does not ye
def0: 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f  t exist..  ** Do
df00: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
df10: 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73  write if databas
df20: 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72  e file has never
df30: 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20   been opened..  
df40: 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  */.  pPg = pager
df50: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
df60: 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52  pgno);.  PAGERTR
df70: 41 43 45 34 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE4("PLAYBACK %
df80: 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
df90: 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
dfa0: 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
dfb0: 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
dfc0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
dfd0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
dfe0: 61 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20 70  aData));.  if( p
dff0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
e000: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
e010: 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d   (pPg==0 || pPg-
e020: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 0a 20 20  >needSync==0).  
e030: 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
e040: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
e050: 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
e060: 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
e070: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e080: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
e090: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
e0a0: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  ->fd, aData, pPa
e0b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
e0c0: 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ffset);.    if( 
e0d0: 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b  pPg ){.      mak
e0e0: 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
e0f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67   }.  }.  if( pPg
e100: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
e110: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
e120: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
e130: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
e140: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
e150: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
e160: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
e170: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
e180: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
e190: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
e1a0: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
e1b0: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
e1c0: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
e1d0: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
e1e0: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
e1f0: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
e200: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
e210: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
e220: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
e230: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
e240: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
e250: 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61  *pData;.    /* a
e260: 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
e270: 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  ==0 || pPg->pgno
e280: 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44  ==1 ); */.    pD
e290: 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  ata = PGHDR_TO_D
e2a0: 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65  ATA(pPg);.    me
e2b0: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
e2c0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
e2d0: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
e2e0: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
e2f0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e300: 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c 20  >xReiniter(pPg, 
e310: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e320: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
e330: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
e340: 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
e350: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
e360: 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
e370: 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  if.    /* If thi
e380: 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
e390: 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
e3a0: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
e3b0: 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
e3c0: 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
e3d0: 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
e3e0: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
e3f0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
e400: 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
e410: 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
e420: 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
e430: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
e440: 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
e450: 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
e460: 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
e470: 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
e480: 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
e490: 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
e4a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
e4b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
e4c0: 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
e4d0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
e4e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e4f0: 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
e500: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
e510: 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
e520: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e530: 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
e540: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
e550: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
e560: 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
e570: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
e580: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
e590: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
e5a0: 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
e5b0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
e5c0: 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
e5d0: 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
e5e0: 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
e5f0: 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
e600: 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
e610: 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
e620: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
e630: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
e640: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  r journal file c
e650: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
e660: 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a  s of all child j
e670: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74  ournals..** To t
e680: 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20  ell if a master 
e690: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
e6a0: 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f  eleted, check to
e6b0: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
e6c0: 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c  children.  If al
e6d0: 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65  l children are e
e6e0: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
e6f0: 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f   do not refer to
e700: 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20  .** a different 
e710: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20  master journal, 
e720: 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72  then this master
e730: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
e740: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
e750: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
e760: 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
e770: 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
e780: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
e790: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
e7a0: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
e7b0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
e7c0: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b  master_open = 0;
e7d0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
e7e0: 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69  *pMaster;.  sqli
e7f0: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
e800: 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73  al;.  char *zMas
e810: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
e820: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
e830: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e840: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
e850: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
e860: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
e870: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e880: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
e890: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e8a0: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
e8b0: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
e8c0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
e8d0: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
e8e0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
e8f0: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
e900: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
e910: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70  erence..  */.  p
e920: 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
e930: 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
e940: 5f 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a  _malloc(pVfs->sz
e950: 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70  OsFile * 2);.  p
e960: 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74  Journal = (sqlit
e970: 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20  e3_file *)(((u8 
e980: 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66  *)pMaster) + pVf
e990: 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20  s->szOsFile);.  
e9a0: 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a  if( !pMaster ){.
e9b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e9c0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
e9d0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
e9e0: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
e9f0: 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
ea00: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
ea10: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
ea20: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
ea30: 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
ea40: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
ea50: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ea60: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
ea70: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73  aster_out;.  mas
ea80: 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20  ter_open = 1;.. 
ea90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
eaa0: 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
eab0: 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
eac0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
ead0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
eae0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
eaf0: 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
eb00: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
eb10: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
eb20: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
eb30: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
eb40: 61 73 74 65 72 50 74 72 20 3d 20 70 50 61 67 65  asterPtr = pPage
eb50: 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
eb60: 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ame+1;..    /* L
eb70: 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
eb80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
eb90: 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
eba0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
ebb0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
ebc0: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
ebd0: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
ebe0: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
ebf0: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
ec00: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
ec10: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  e3_malloc(nMaste
ec20: 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
ec30: 65 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20  erPtr);.    if( 
ec40: 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
ec50: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
ec60: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
ec70: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
ec80: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
ec90: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
eca0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
ecb0: 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20  sterJournal];.  
ecc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
ecd0: 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d  Read(pMaster, zM
ece0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d  asterJournal, nM
ecf0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
ed00: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
ed10: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
ed20: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
ed30: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
ed40: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
ed50: 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
ed60: 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
ed70: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
ed80: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
ed90: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
eda0: 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
edb0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
edc0: 49 53 54 53 29 3b 0a 20 20 20 20 20 20 69 66 28  ISTS);.      if(
edd0: 20 72 63 21 3d 30 20 26 26 20 72 63 21 3d 31 20   rc!=0 && rc!=1 
ede0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
edf0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
ee00: 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
ee10: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
ee20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ee30: 28 20 72 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc==1 ){.     
ee40: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
ee50: 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
ee60: 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
ee70: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
ee80: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
ee90: 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
eea0: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
eeb0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
eec0: 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
eed0: 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
eee0: 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
eef0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ef00: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
ef10: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  /.        int c;
ef20: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61  .        int fla
ef30: 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
ef40: 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
ef50: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
ef60: 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63  NAL);.        rc
ef70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
ef80: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
ef90: 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
efa0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
efb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
efc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
efd0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
efe0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
eff0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
f000: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
f010: 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
f020: 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
f030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
f040: 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
f050: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
f060: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f070: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
f080: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
f090: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20     }..        c 
f0a0: 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21  = zMasterPtr[0]!
f0b0: 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
f0c0: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
f0d0: 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66  )==0;.        if
f0e0: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( c ){.         
f0f0: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
f100: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
f110: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
f120: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
f130: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
f140: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
f150: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f160: 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
f170: 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61   (strlen(zJourna
f180: 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l)+1);.    }.  }
f190: 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
f1a0: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
f1b0: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
f1c0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
f1d0: 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
f1e0: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
f1f0: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
f200: 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
f210: 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  if( master_open 
f220: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
f230: 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
f240: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
f250: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ee(pMaster);.  r
f260: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74  eturn rc;.}...st
f270: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
f280: 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50  truncate_cache(P
f290: 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a  ager *pPager);..
f2a0: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
f2b0: 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20  he main file of 
f2c0: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20  the given pager 
f2d0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f2e0: 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61   pages.** indica
f2f0: 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61  ted. Also trunca
f300: 74 65 20 74 68 65 20 63 61 63 68 65 64 20 72 65  te the cached re
f310: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
f320: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
f330: 4d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74  Might might be t
f340: 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
f350: 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
f360: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 50   smaller than nP
f370: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e  age..** This can
f380: 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61   happen, for exa
f390: 6d 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65 20  mple, if we are 
f3a0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
f3b0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
f3c0: 2a 20 77 68 69 63 68 20 68 61 73 20 65 78 74 65  * which has exte
f3d0: 6e 64 65 64 20 74 68 65 20 66 69 6c 65 20 73 69  nded the file si
f3e0: 7a 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20 70  ze and the new p
f3f0: 61 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20 61  ages are still a
f400: 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63 61  ll held.** in ca
f410: 63 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e 53  che, then an INS
f420: 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 64 6f  ERT or UPDATE do
f430: 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72  es a statement r
f440: 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a  ollback.  Some.*
f450: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
f460: 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
f470: 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
f480: 73 65 64 20 69 66 20 79 6f 75 20 74 72 79 20 74  sed if you try t
f490: 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20  o.** truncate a 
f4a0: 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a  file to some siz
f4b0: 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  e that is larger
f4c0: 20 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e 74   than it current
f4d0: 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65 74  ly is,.** so det
f4e0: 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
f4f0: 64 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20  d do not do the 
f500: 74 72 75 6e 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  truncation..*/.s
f510: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
f520: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
f530: 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67  pPager, int nPag
f540: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
f550: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
f560: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
f570: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
f580: 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  & pPager->fd->pM
f590: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36  ethods ){.    i6
f5a0: 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
f5b0: 65 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  ewSize;.    rc =
f5c0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
f5d0: 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
f5e0: 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
f5f0: 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67    newSize = pPag
f600: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
f610: 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
f620: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
f630: 26 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65  & currentSize>ne
f640: 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  wSize ){.      r
f650: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
f660: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
f670: 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
f680: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
f690: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f6a0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
f6b0: 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67  = nPage;.    pag
f6c0: 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
f6d0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
f6e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f6f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63  *.** Set the sec
f700: 74 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65 20  torSize for the 
f710: 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a  given pager..**.
f720: 2a 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  ** The sector si
f730: 7a 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 61  ze is at least a
f740: 73 20 62 69 67 20 61 73 20 74 68 65 20 73 65 63  s big as the sec
f750: 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72 74 65  tor size reporte
f760: 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 33 4f  d.** by sqlite3O
f770: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 20 20  sSectorSize().  
f780: 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 65 63 74  The minimum sect
f790: 6f 72 20 73 69 7a 65 20 69 73 20 35 31 32 2e 0a  or size is 512..
f7a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
f7b0: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
f7c0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
f7d0: 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
f7e0: 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
f7f0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
f800: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
f810: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  mpFile ){.    /*
f820: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65   Sector size doe
f830: 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20  sn't matter for 
f840: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
f850: 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a   Also, the file.
f860: 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68      ** may not h
f870: 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
f880: 79 65 74 2c 20 69 6e 20 77 68 63 69 68 20 63 61  yet, in whcih ca
f890: 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53  se the OsSectorS
f8a0: 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  ize().    ** cal
f8b0: 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  l will segfault.
f8c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
f8d0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
f8e0: 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
f8f0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
f900: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
f910: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 35  er->sectorSize<5
f920: 31 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  12 ){.    pPager
f930: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
f940: 31 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  12;.  }.}../*.**
f950: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
f960: 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
f970: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
f980: 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
f990: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
f9a0: 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
f9b0: 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
f9c0: 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
f9d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
f9e0: 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
f9f0: 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
fa00: 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
fa10: 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
fa20: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
fa30: 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
fa40: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
fa50: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
fa60: 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
fa70: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
fa80: 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
fa90: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
faa0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
fab0: 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
fac0: 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
fad0: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
fae0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
faf0: 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
fb00: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
fb10: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
fb20: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
fb30: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
fb40: 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
fb50: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
fb60: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
fb70: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
fb80: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
fb90: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
fba0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
fbb0: 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
fbc0: 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
fbd0: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
fbe0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
fbf0: 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
fc00: 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
fc10: 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
fc20: 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
fc30: 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
fc40: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
fc50: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
fc60: 74 68 65 20 70 61 67 65 20 63 61 73 65 2e 0a 2a  the page case..*
fc70: 2a 20 20 28 37 29 20 20 34 20 62 79 74 65 20 69  *  (7)  4 byte i
fc80: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
fc90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
fca0: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
fcb0: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  r journal.**    
fcc0: 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61     name.  The va
fcd0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20  lue may be zero 
fce0: 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74  (indicate that t
fcf0: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
fd00: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
fd10: 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20 20 4e 20  al.).**  (8)  N 
fd20: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73  bytes of the mas
fd30: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
fd40: 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c  .  The name will
fd50: 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   be nul-terminat
fd60: 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  ed.**       and 
fd70: 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72  might be shorter
fd80: 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20   than the value 
fd90: 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20  read from (5).  
fda0: 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  If the first byt
fdb0: 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  e.**       of th
fdc0: 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74  e name is \000 t
fdd0: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
fde0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
fdf0: 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20   The master.**  
fe00: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d       journal nam
fe10: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55  e is stored in U
fe20: 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29 20 20 5a  TF-8..**  (9)  Z
fe30: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
fe40: 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
fe50: 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
fe60: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
fe70: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
fe80: 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
fe90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
fea0: 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
feb0: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
fec0: 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
fed0: 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
fee0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fef0: 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
ff00: 66 69 72 73 74 20 38 20 69 74 65 6d 73 20 61 62  first 8 items ab
ff10: 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
ff20: 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
ff30: 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
ff40: 20 6f 66 20 74 68 65 20 39 74 68 20 69 74 65 6d   of the 9th item
ff50: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
ff60: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
ff70: 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
ff80: 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
ff90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
ffa0: 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
ffb0: 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
ffc0: 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
ffd0: 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
ffe0: 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
fff0: 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
10000 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
10010 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
10020 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
10030 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
10040 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
10050 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
10060 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
10070 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
10080 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
10090 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
100a0 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
100b0 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
100c0 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
100d0 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
100e0 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
100f0 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
10100 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
10110 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
10120 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
10130 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
10140 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
10150 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
10160 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
10170 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
10180 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
10190 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
101a0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
101b0 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
101c0 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
101d0 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
101e0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
101f0 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
10200 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
10210 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
10220 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
10230 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
10240 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
10250 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
10260 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
10270 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
10280 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
10290 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
102a0 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
102b0 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
102c0 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
102d0 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
102e0 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
102f0 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
10300 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
10310 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
10320 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
10330 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
10340 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
10350 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
10360 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
10370 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
10380 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
10390 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
103a0 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
103b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
103c0 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
103d0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
103e0 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
103f0 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
10400 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
10410 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
10420 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
10430 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
10440 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
10450 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
10460 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
10470 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
10480 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
10490 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
104a0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
104b0 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
104c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
104d0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
104e0 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  s;.  i64 szJ;   
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10500 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
10510 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
10520 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
10530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10540 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
10550 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
10560 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rnal */.  int i;
10570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10580 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
10590 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
105a0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
105b0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
105c0 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
105d0 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
105e0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
105f0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
10600 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
10610 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
10620 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10630 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
10640 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
10650 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
10660 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
10670 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
10680 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
10690 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
106a0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
106b0 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
106c0 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
106d0 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
106e0 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
106f0 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
10700 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
10710 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10720 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
10730 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
10740 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
10750 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
10760 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d  LITE_OK || szJ==
10770 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  0 ){.    goto en
10780 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
10790 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
107a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
107b0 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
107c0 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
107d0 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
107e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
107f0 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
10800 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
10810 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
10820 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
10830 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
10840 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
10850 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
10860 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
10870 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a  d back..  */.  z
10880 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
10890 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
108a0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
108b0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
108c0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
108d0 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
108e0 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
108f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
10900 7a 4d 61 73 74 65 72 5b 30 5d 20 0a 20 20 20 26  zMaster[0] .   &
10910 26 20 28 72 65 73 3d 73 71 6c 69 74 65 33 4f 73  & (res=sqlite3Os
10920 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
10930 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
10940 45 53 53 5f 45 58 49 53 54 53 29 29 3d 3d 30 20  ESS_EXISTS))==0 
10950 29 20 0a 20 20 29 7b 0a 20 20 20 20 7a 4d 61 73  ) .  ){.    zMas
10960 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  ter = 0;.    got
10970 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
10980 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
10990 30 3b 0a 20 20 69 66 28 20 72 65 73 3c 30 20 29  0;.  if( res<0 )
109a0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
109b0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
109c0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
109d0 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
109e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
109f0 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c   0;..  /* This l
10a00 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
10a10 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72  ither when the r
10a20 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
10a30 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a  call returns.  *
10a40 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  * SQLITE_DONE or
10a50 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
10a60 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28  urs. */.  while(
10a70 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65   1 ){..    /* Re
10a80 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
10a90 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
10aa0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10ab0 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
10ac0 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
10ad0 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
10ae0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10af0 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
10b00 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
10b10 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
10b20 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
10b30 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64  s must of failed
10b40 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
10b50 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
10b60 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
10b70 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
10b80 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
10b90 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
10ba0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
10bb0 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
10bc0 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
10bd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10be0 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
10bf0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
10c00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
10c10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
10c20 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
10c30 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
10c40 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
10c50 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
10c60 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
10c70 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
10c80 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
10c90 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
10ca0 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
10cb0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
10cc0 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
10cd0 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
10ce0 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
10cf0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
10d00 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
10d10 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
10d20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
10d30 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
10d40 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
10d50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
10d60 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
10d70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
10d80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10d90 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
10da0 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
10db0 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
10dc0 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
10dd0 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
10de0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
10df0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
10e00 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
10e10 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
10e20 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
10e30 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
10e40 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
10e50 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
10e60 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
10e70 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
10e80 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
10e90 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
10ea0 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
10eb0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
10ec0 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
10ed0 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
10ee0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
10ef0 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
10f00 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
10f10 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
10f20 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
10f30 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
10f40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
10f50 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
10f60 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
10f70 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
10f80 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  2565..    */.   
10f90 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
10fa0 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
10fb0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10fc0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
10fd0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
10fe0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10ff0 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
11000 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
11010 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
11020 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
11030 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
11040 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
11050 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
11060 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
11070 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
11080 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
11090 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
110a0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
110b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
110c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
110d0 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
110e0 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
110f0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
11100 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
11110 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
11120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11130 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
11140 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
11150 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11160 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
11170 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
11180 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
11190 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
111a0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
111b0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
111c0 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nRec; i++){.  
111d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
111e0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
111f0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
11200 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
11210 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
11220 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11230 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11240 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11250 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
11260 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
11270 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
11280 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
11290 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
112a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
112b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
112c0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
112d0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
112e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
112f0 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
11300 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
11310 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
11320 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11330 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
11340 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
11350 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
11360 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
11370 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
11380 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
11390 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
113a0 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  1);.  }.  if( rc
113b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
113c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
113d0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
113e0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
113f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11400 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
11410 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
11420 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
11430 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
11440 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
11450 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
11460 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
11470 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
11480 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
11490 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
114a0 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
114b0 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
114c0 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  aster);.  }..  /
114d0 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
114e0 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
114f0 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
11500 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
11510 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
11520 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
11530 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
11540 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
11550 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
11560 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
11570 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
11580 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
11590 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
115a0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
115b0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
115c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
115d0 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
115e0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
115f0 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
11600 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
11610 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11620 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
11630 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
11640 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
11650 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
11660 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
11670 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
11680 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
11690 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
116a0 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
116b0 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
116c0 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
116d0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
116e0 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
116f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
11700 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
11710 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
11720 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
11730 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
11740 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
11750 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
11760 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
11770 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
11780 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
11790 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
117a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
117b0 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
117c0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
117d0 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117f0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
11800 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
11810 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69   i64 hdrOff;.  i
11820 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
11830 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11840 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
11850 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
11860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11870 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11880 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d  int rc;..  szJ =
11890 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
118a0 4f 66 66 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 68  Off;..  /* Set h
118b0 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20  drOff to be the 
118c0 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66 74 65  offset just afte
118d0 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
118e0 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20   last journal.  
118f0 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  ** page written 
11900 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
11910 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
11920 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d 65  for this stateme
11930 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  nt.  ** transact
11940 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c  ion was written,
11950 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74   or the end of t
11960 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f  he file if no jo
11970 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  urnal.  ** heade
11980 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20  r was written.. 
11990 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70   */.  hdrOff = p
119a0 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
119b0 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f;.  assert( pPa
119c0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c  ger->fullSync ||
119d0 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66   !hdrOff );.  if
119e0 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20  ( !hdrOff ){.   
119f0 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20   hdrOff = szJ;. 
11a00 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63   }.  .  /* Trunc
11a10 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
11a20 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
11a30 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f  ginal size..  */
11a40 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
11a50 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
11a60 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29  Pager->stmtSize)
11a70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11a80 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
11a90 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a  _SHARED );..  /*
11aa0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
11ab0 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
11ac0 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
11ad0 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t journal..  */.
11ae0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11af0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70  ->stmtInUse && p
11b00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
11b10 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70  en );.  nRec = p
11b20 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b  Pager->stmtNRec;
11b30 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72  .  .  /* Copy or
11b40 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
11b50 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
11b60 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  t journal and ba
11b70 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ck into the.  **
11b80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11b90 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
11ba0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
11bb0 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73   omits checksums
11bc0 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20   from.  ** each 
11bd0 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77  record since pow
11be0 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76  er-failure recov
11bf0 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72  ery is not impor
11c00 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e  tant to statemen
11c10 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e  t.  ** journals.
11c20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
11c30 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20   i<nRec; i++){. 
11c40 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
11c50 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
11c60 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d  eSize);.    rc =
11c70 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
11c80 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
11c90 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f   pPager->stfd, o
11ca0 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 61  ffset, 0);.    a
11cb0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
11cc0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
11cd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11ce0 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
11cf0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
11d00 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d   /* Now roll som
11d10 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f  e pages back fro
11d20 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  m the transactio
11d30 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72  n journal. Pager
11d40 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20  .stmtJSize.  ** 
11d50 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  was the size of 
11d60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11d70 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65   when this state
11d80 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
11d90 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74  , so.  ** everyt
11da0 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20  hing after that 
11db0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
11dc0 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20  ed back, either 
11dd0 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
11de0 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f  tabase, the memo
11df0 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74  ry cache, or bot
11e00 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  h..  **.  ** If 
11e10 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  it is not zero, 
11e20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48  then Pager.stmtH
11e30 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66  drOff is the off
11e40 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
11e50 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72  .  ** of the fir
11e60 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
11e70 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67  r written during
11e80 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
11e90 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
11ea0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  /.  pPager->jour
11eb0 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  nalOff = pPager-
11ec0 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50  >stmtJSize;.  pP
11ed0 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20  ager->cksumInit 
11ee0 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b  = pPager->stmtCk
11ef0 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 50  sum;.  while( pP
11f00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11f10 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20 20   < hdrOff ){.   
11f20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
11f30 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
11f40 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
11f50 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
11f60 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 61  alOff, 1);.    a
11f70 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
11f80 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
11f90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11fa0 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
11fb0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
11fc0 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
11fd0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
11fe0 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   ){.    u32 nJRe
11ff0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  c;         /* Nu
12000 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
12010 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
12020 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
12030 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
12040 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
12050 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
12060 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12070 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
12080 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
12090 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
120a0 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
120b0 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
120c0 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29    if( nJRec==0 )
120d0 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
120e0 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
120f0 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50  ournalOff) / (pP
12100 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
12110 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
12120 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30  (i=nJRec-1; i>=0
12130 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
12140 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d  nalOff < szJ; i-
12150 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  -){.      rc = p
12160 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
12170 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
12180 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
12190 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
121a0 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
121b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
121c0 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  E );.      if( r
121d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
121e0 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
121f0 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  yback;.    }.  }
12200 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
12210 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
12220 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61  .end_stmt_playba
12230 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
12240 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70  LITE_OK) {.    p
12250 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
12260 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20  f = szJ;.    /* 
12270 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
12280 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  he(pPager); */. 
12290 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
122a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
122b0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
122c0 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
122d0 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
122e0 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  llowed..*/.void 
122f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
12300 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
12310 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
12320 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
12330 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>10 ){.    pPag
12340 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50  er->mxPage = mxP
12350 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
12360 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
12370 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = 10;.  }.}../*
12380 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72  .** Adjust the r
12390 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65  obustness of the
123a0 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
123b0 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
123c0 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65  ashes.** or powe
123d0 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68  r failures by ch
123e0 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
123f0 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
12400 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  en writing.** th
12410 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
12420 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74  al.  There are t
12430 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a  hree levels:.**.
12440 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20  **    OFF       
12450 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
12460 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
12470 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
12480 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  fault.**        
12490 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72        for tempor
124a0 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e  ary and transien
124b0 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  t files..**.**  
124c0 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20    NORMAL    The 
124d0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
124e0 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72  d once before wr
124f0 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
12500 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
12510 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69    database.  Thi
12520 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64  s is normally ad
12530 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f  equate protectio
12540 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20  n, but.**       
12550 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65         it is the
12560 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69  oretically possi
12570 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79  ble, though very
12580 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20   unlikely,.**   
12590 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
125a0 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f  an inopertune po
125b0 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
125c0 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72  d leave the jour
125d0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
125e0 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77      in a state w
125f0 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65  hich would cause
12600 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
12610 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
12620 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20          when it 
12630 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
12640 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20  **.**    FULL   
12650 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
12660 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62  s synced twice b
12670 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
12680 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
12690 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
126a0 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64  se (with some ad
126b0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
126c0 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20  tion - the nRec 
126d0 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
126e0 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75        of the jou
126f0 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65  rnal header - be
12700 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62  ing written in b
12710 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a  etween the two.*
12720 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
12730 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73  yncs).  If we as
12740 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e  sume that writin
12750 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  g a.**          
12760 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20      single disk 
12770 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63  sector is atomic
12780 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65  , then this mode
12790 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20   provides.**    
127a0 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61            assura
127b0 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  nce that the jou
127c0 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rnal will not be
127d0 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68   corrupted to th
127e0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
127f0 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69    point of causi
12800 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  ng damage to the
12810 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67   database during
12820 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
12830 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
12840 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
12850 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
12860 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
12870 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
12880 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
12890 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
128a0 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
128b0 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
128c0 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50  yLevel(Pager *pP
128d0 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ager, int level,
128e0 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29   int full_fsync)
128f0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  {.  pPager->noSy
12900 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c  nc =  level==1 |
12910 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
12920 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
12930 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d  llSync = level==
12940 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  3 && !pPager->te
12950 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
12960 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28  ->sync_flags = (
12970 66 75 6c 6c 5f 66 73 79 6e 63 3f 53 51 4c 49 54  full_fsync?SQLIT
12980 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49  E_SYNC_FULL:SQLI
12990 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
129a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
129b0 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
129c0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  needSync = 0;.}.
129d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
129e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
129f0 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
12a00 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
12a10 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
12a20 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
12a30 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
12a40 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
12a50 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
12a60 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
12a70 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
12a80 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
12a90 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
12aa0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
12ab0 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
12ac0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
12ad0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a  emporary file. .
12ae0 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
12af0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12b00 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72  into *fd.  Retur
12b10 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
12b20 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a  uccess or some.*
12b30 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  * other error co
12b40 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
12b50 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
12b60 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
12b70 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a  the temporary.**
12b80 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
12b90 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
12ba0 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61  ic int sqlite3Pa
12bb0 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 73  gerOpentemp(.  s
12bc0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
12bd0 2c 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  ,    /* The virt
12be0 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
12bf0 6c 61 79 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  layer */.  sqlit
12c00 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
12c10 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
12c20 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
12c30 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  re */.  char *zF
12c40 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a  ilename,      /*
12c50 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
12c60 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  e.  Might be NUL
12c70 4c 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  L */.  int vfsFl
12c80 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
12c90 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
12ca0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
12cb0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
12cc0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
12cd0 61 6d 65 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65  ame!=0 );..#ifde
12ce0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
12cf0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
12d00 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73  _count++;  /* Us
12d10 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
12d20 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
12d30 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66   */.#endif..  vf
12d40 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54  sFlags |=  SQLIT
12d50 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
12d60 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
12d70 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
12d80 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
12d90 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49  EXCLUSIVE | SQLI
12da0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
12db0 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71  CLOSE;.  rc = sq
12dc0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
12dd0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69  , zFilename, pFi
12de0 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29  le, vfsFlags, 0)
12df0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
12e00 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69  SQLITE_OK || pFi
12e10 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  le->pMethods );.
12e20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12e30 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
12e40 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  ew page cache an
12e50 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
12e60 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
12e70 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a  e in *ppPager..*
12e80 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65  * The file to be
12e90 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74   cached need not
12ea0 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c   exist.  The fil
12eb0 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20  e is not locked 
12ec0 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72  until.** the fir
12ed0 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
12ee0 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
12ef0 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70   is only held op
12f00 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  en until the.** 
12f10 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
12f20 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
12f30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
12f40 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
12f50 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
12f60 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
12f70 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
12f80 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
12f90 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
12fa0 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
12fb0 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c  .  The file will
12fc0 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
12fd0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
12fe0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
12ff0 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
13000 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
13010 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d   then all inform
13020 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
13030 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73   cache..** It is
13040 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
13050 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61  o disk.  This ca
13060 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
13070 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d  lement an.** in-
13080 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
13090 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
130a0 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
130b0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
130c0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
130d0 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
130e0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65  to use */.  Page
130f0 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
13100 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
13110 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
13120 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
13130 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
13140 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
13150 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13160 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
13170 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
13180 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
13190 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
131a0 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
131b0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
131c0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
131d0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
131e0 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
131f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
13200 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
13210 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
13220 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
13230 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
13240 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
13250 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
13260 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  r = 0;.  int rc 
13270 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
13280 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  nt i;.  int temp
13290 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  File = 0;.  int 
132a0 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74  memDb = 0;.  int
132b0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
132c0 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
132d0 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
132e0 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
132f0 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  0;.  int noReadl
13300 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
13310 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
13320 29 21 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72  )!=0;.  int jour
13330 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71  nalFileSize = sq
13340 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
13350 28 70 56 66 73 29 3b 0a 20 20 69 6e 74 20 6e 44  (pVfs);.  int nD
13360 65 66 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c  efaultPage = SQL
13370 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
13380 5f 53 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a  _SIZE;.  char *z
13390 50 61 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  Pathname;.  int 
133a0 6e 50 61 74 68 6e 61 6d 65 3b 0a 20 20 63 68 61  nPathname;.  cha
133b0 72 20 2a 7a 53 74 6d 74 4a 72 6e 6c 3b 0a 20 20  r *zStmtJrnl;.  
133c0 69 6e 74 20 6e 53 74 6d 74 4a 72 6e 6c 3b 0a 0a  int nStmtJrnl;..
133d0 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
133e0 20 72 65 74 75 72 6e 20 69 73 20 61 20 4e 55 4c   return is a NUL
133f0 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a  L pointer */.  *
13400 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20  ppPager = 0;..  
13410 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66  /* Compute the f
13420 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 2a 2f 0a  ull pathname */.
13430 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
13440 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
13450 3b 0a 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ;.  zPathname = 
13460 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
13470 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 69  Pathname*2);.  i
13480 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
13490 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
134a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
134b0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
134c0 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
134d0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
134e0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
134f0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
13500 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
13510 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
13520 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
13530 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
13540 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
13550 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
13560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
13570 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
13580 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
13590 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
135a0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  e);.    }.  }els
135b0 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
135c0 74 65 33 4f 73 47 65 74 54 65 6d 70 6e 61 6d 65  te3OsGetTempname
135d0 28 70 56 66 73 2c 20 6e 50 61 74 68 6e 61 6d 65  (pVfs, nPathname
135e0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
135f0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
13600 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
13610 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
13620 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
13630 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 68   rc;.  }.  nPath
13640 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 50  name = strlen(zP
13650 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  athname);..  /* 
13660 50 75 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  Put the statemen
13670 74 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 65 6d  t journal in tem
13680 70 6f 72 61 72 79 20 64 69 73 6b 20 73 70 61 63  porary disk spac
13690 65 20 73 69 6e 63 65 20 74 68 69 73 20 69 73 0a  e since this is.
136a0 20 20 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 52    ** sometimes R
136b0 41 4d 20 64 69 73 6b 20 6f 72 20 6f 74 68 65 72  AM disk or other
136c0 20 6f 70 74 69 6d 69 7a 65 64 20 73 74 6f 72 61   optimized stora
136d0 67 65 2e 20 20 55 6e 6c 69 6b 65 6c 79 20 74 68  ge.  Unlikely th
136e0 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 61 69 6e  e main.  ** main
136f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
13700 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
13710 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  rnal does not ne
13720 65 64 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 63  ed to be .  ** c
13730 6f 6c 6f 63 61 74 65 64 20 77 69 74 68 20 74 68  olocated with th
13740 65 20 64 61 74 61 62 61 73 65 20 6e 6f 72 20 64  e database nor d
13750 6f 65 73 20 69 74 20 6e 65 65 64 20 74 6f 20 62  oes it need to b
13760 65 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20  e persistent..  
13770 2a 2f 0a 20 20 7a 53 74 6d 74 4a 72 6e 6c 20 3d  */.  zStmtJrnl =
13780 20 26 7a 50 61 74 68 6e 61 6d 65 5b 6e 50 61 74   &zPathname[nPat
13790 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 72 63 20 3d  hname+1];.  rc =
137a0 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54 65 6d   sqlite3OsGetTem
137b0 70 6e 61 6d 65 28 70 56 66 73 2c 20 70 56 66 73  pname(pVfs, pVfs
137c0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 2c 20  ->mxPathname+1, 
137d0 7a 53 74 6d 74 4a 72 6e 6c 29 3b 0a 20 20 69 66  zStmtJrnl);.  if
137e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
137f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
13800 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
13810 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13820 20 7d 0a 20 20 6e 53 74 6d 74 4a 72 6e 6c 20 3d   }.  nStmtJrnl =
13830 20 73 74 72 6c 65 6e 28 7a 53 74 6d 74 4a 72 6e   strlen(zStmtJrn
13840 6c 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  l);..  /* Alloca
13850 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
13860 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
13870 65 20 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20  e */.  pPager = 
13880 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
13890 6f 28 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70  o(.    sizeof(*p
138a0 50 61 67 65 72 29 20 2b 20 20 20 20 20 20 20 20  Pager) +        
138b0 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75     /* Pager stru
138c0 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 6a 6f 75  cture */.    jou
138d0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20  rnalFileSize +  
138e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
138f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 72  journal file str
13900 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20 20 70  ucture */ .    p
13910 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
13920 33 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  3 +        /* Th
13930 65 20 6d 61 69 6e 20 64 62 20 61 6e 64 20 74 77  e main db and tw
13940 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  o journal files 
13950 2a 2f 20 0a 20 20 20 20 33 2a 6e 50 61 74 68 6e  */ .    3*nPathn
13960 61 6d 65 20 2b 20 34 30 20 2b 20 20 20 20 20 20  ame + 40 +      
13970 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
13980 2c 20 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 4a  , zDirectory, zJ
13990 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 6e 53  ournal */.    nS
139a0 74 6d 74 4a 72 6e 6c 20 20 20 20 20 20 20 20 20  tmtJrnl         
139b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 53 74            /* zSt
139c0 6d 74 4a 72 6e 6c 20 2a 2f 0a 20 20 29 3b 0a 20  mtJrnl */.  );. 
139d0 20 69 66 28 20 21 70 50 61 67 65 72 20 29 7b 0a   if( !pPager ){.
139e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
139f0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
13a00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13a10 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 74 72  OMEM;.  }.  pPtr
13a20 20 3d 20 28 75 38 20 2a 29 26 70 50 61 67 65 72   = (u8 *)&pPager
13a30 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76  [1];.  pPager->v
13a40 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61  fsFlags = vfsFla
13a50 67 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  gs;.  pPager->fd
13a60 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
13a70 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
13a80 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61  OsFile*0];.  pPa
13a90 67 65 72 2d 3e 73 74 66 64 20 3d 20 28 73 71 6c  ger->stfd = (sql
13aa0 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72  ite3_file*)&pPtr
13ab0 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a  [pVfs->szOsFile*
13ac0 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  1];.  pPager->jf
13ad0 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
13ae0 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73  e*)&pPtr[pVfs->s
13af0 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a 20 20 70 50  zOsFile*2];.  pP
13b00 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
13b10 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72 5b 70  = (char*)&pPtr[p
13b20 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 2b  Vfs->szOsFile*2+
13b30 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d  journalFileSize]
13b40 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  ;.  pPager->zDir
13b50 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72  ectory = &pPager
13b60 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
13b70 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67  hname+1];.  pPag
13b80 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
13b90 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
13ba0 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b  ry[nPathname+1];
13bb0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74  .  pPager->zStmt
13bc0 4a 72 6e 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  Jrnl = &pPager->
13bd0 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
13be0 6d 65 2b 31 30 5d 3b 0a 20 20 70 50 61 67 65 72  me+10];.  pPager
13bf0 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
13c00 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
13c10 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
13c20 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b  name, nPathname+
13c30 31 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61  1);.  memcpy(pPa
13c40 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 2c 20  ger->zStmtJrnl, 
13c50 7a 53 74 6d 74 4a 72 6e 6c 2c 20 6e 53 74 6d 74  zStmtJrnl, nStmt
13c60 4a 72 6e 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74  Jrnl+1);.  sqlit
13c70 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
13c80 65 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  e);..  /* Open t
13c90 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
13ca0 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
13cb0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
13cc0 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b  [0] && !memDb ){
13cd0 0a 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61  .    if( nPathna
13ce0 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  me>(pVfs->mxPath
13cf0 6e 61 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d  name - sizeof("-
13d00 6a 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20  journal")) ){.  
13d10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13d20 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65  CANTOPEN;.    }e
13d30 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  lse{.      int f
13d40 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  out = 0;.      r
13d50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
13d60 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
13d70 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
13d80 72 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20  r->fd,.         
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13da0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
13db0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
13dc0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
13dd0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
13de0 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f  DONLY);..      /
13df0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
13e00 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
13e10 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
13e20 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
13e30 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
13e40 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
13e50 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
13e60 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
13e70 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
13e80 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
13e90 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
13ea0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
13eb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
13ec0 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
13ed0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
13ee0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  .      **    + T
13ef0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
13f00 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
13f10 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20  ctorSize().     
13f20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
13f30 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
13f40 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
13f50 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
13f60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
13f70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13f80 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
13f90 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 63          int iSec
13fa0 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
13fb0 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
13fc0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
13fd0 20 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50     if( nDefaultP
13fe0 61 67 65 3c 69 53 65 63 74 6f 72 53 69 7a 65 20  age<iSectorSize 
13ff0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65  ){.          nDe
14000 66 61 75 6c 74 50 61 67 65 20 3d 20 69 53 65 63  faultPage = iSec
14010 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
14020 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
14030 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
14040 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20  RITE.        {. 
14050 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63           int iDc
14060 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
14070 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
14080 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
14090 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b           int ii;
140a0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
140b0 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
140c0 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
140d0 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
140e0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
140f0 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
14100 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
14110 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
14120 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
14130 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
14140 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
14150 69 69 3d 6e 44 65 66 61 75 6c 74 50 61 67 65 3b  ii=nDefaultPage;
14160 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
14170 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
14180 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
14190 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
141a0 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
141b0 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
141c0 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20   nDefaultPage = 
141d0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
141e0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
141f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65  .        if( nDe
14200 66 61 75 6c 74 50 61 67 65 3e 53 51 4c 49 54 45  faultPage>SQLITE
14210 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
14220 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
14230 20 20 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65      nDefaultPage
14240 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45   = SQLITE_MAX_DE
14250 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
14260 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14270 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
14280 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20   if( !memDb ){. 
14290 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f     /* If a tempo
142a0 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71  rary file is req
142b0 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f  uested, it is no
142c0 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61  t opened immedia
142d0 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  tely..    ** In 
142e0 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63  this case we acc
142f0 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  ept the default 
14300 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65  page size and de
14310 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  lay actually.   
14320 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20   ** opening the 
14330 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66  file until the f
14340 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57  irst call to OsW
14350 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a  rite()..    */ .
14360 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
14370 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
14380 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
14390 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66  USIVE;.  }..  if
143a0 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d  ( pPager && rc==
143b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
143c0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
143d0 63 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ce = (char *)sql
143e0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 44 65 66  ite3_malloc(nDef
143f0 61 75 6c 74 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  aultPage);.  }..
14400 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
14410 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
14420 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
14430 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65   above..  ** Fre
14440 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
14450 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
14460 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53  the file..  ** S
14470 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
14480 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20  s not allocated 
14490 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
144a0 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e   to set .  ** an
144b0 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20  y Pager.errMask 
144c0 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  variables..  */.
144d0 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c    if( !pPager ||
144e0 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
144f0 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ace ){.    sqlit
14500 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
14510 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
14520 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
14530 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
14540 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
14550 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
14560 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
14570 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  3("OPEN %d %s\n"
14580 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
14590 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
145a0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
145b0 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
145c0 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
145d0 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
145e0 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c  name))..  /* Fil
145f0 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65  l in Pager.zDire
14600 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d  ctory[] */.  mem
14610 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
14620 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e  ectory, pPager->
14630 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
14640 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69  name+1);.  for(i
14650 3d 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e  =strlen(pPager->
14660 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30  zDirectory); i>0
14670 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72   && pPager->zDir
14680 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27  ectory[i-1]!='/'
14690 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69  ; i--){}.  if( i
146a0 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69  >0 ) pPager->zDi
146b0 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30  rectory[i-1] = 0
146c0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
146d0 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d  Pager.zJournal[]
146e0 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61   */.  memcpy(pPa
146f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
14700 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
14710 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
14720 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
14730 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
14740 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  me], "-journal",
14750 20 39 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65   9);..  /* pPage
14760 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
14770 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
14780 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73  >useJournal = us
14790 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d  eJournal && !mem
147a0 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  Db;.  pPager->no
147b0 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61  Readlock = noRea
147c0 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
147d0 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
147e0 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
147f0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
14800 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
14810 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
14820 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
14830 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d  er->dbSize = mem
14840 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Db-1;.  pPager->
14850 70 61 67 65 53 69 7a 65 20 3d 20 6e 44 65 66 61  pageSize = nDefa
14860 75 6c 74 50 61 67 65 3b 0a 20 20 2f 2a 20 70 50  ultPage;.  /* pP
14870 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
14880 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
14890 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
148a0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
148b0 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
148c0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  .  pPager->mxPag
148d0 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65  e = 100;.  pPage
148e0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
148f0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
14900 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
14910 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
14920 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72  LOCK; */.  asser
14930 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
14940 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
14950 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
14960 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
14970 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
14980 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
14990 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
149a0 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
149b0 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
149c0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
149d0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
149e0 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
149f0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
14a00 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
14a10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
14a20 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
14a30 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
14a40 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
14a50 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c  veMode = tempFil
14a60 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  e; .  pPager->me
14a70 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70  mDb = memDb;.  p
14a80 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
14a90 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  = readOnly;.  /*
14aa0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
14ab0 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  c = 0; */.  pPag
14ac0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
14ad0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
14ae0 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
14af0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
14b00 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
14b10 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65  nc?0:1);.  pPage
14b20 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
14b30 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
14b40 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  AL;.  /* pPager-
14b50 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
14b60 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
14b70 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
14b80 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
14b90 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
14ba0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
14bb0 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
14bc0 6e 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72  nExtra);.  asser
14bd0 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
14be0 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c 74  ethods||memDb||t
14bf0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
14c00 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 65  !memDb ){.    se
14c10 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
14c20 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  er);.  }.  /* pP
14c30 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
14c40 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
14c50 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
14c60 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
14c70 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
14c80 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
14c90 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20   pPager;.#ifdef 
14ca0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
14cb0 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
14cc0 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65    pPager->iInUse
14cd0 4d 4d 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  MM = 0;.  pPager
14ce0 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a  ->iInUseDB = 0;.
14cf0 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a    if( !memDb ){.
14d00 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14d10 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  x *mutex = sqlit
14d20 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
14d30 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
14d40 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 73 71  IC_MEM2);.    sq
14d50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
14d60 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 50  r(mutex);.    pP
14d70 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 73 71  ager->pNext = sq
14d80 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 0a  lite3PagerList;.
14d90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
14da0 61 67 65 72 4c 69 73 74 20 29 7b 0a 20 20 20 20  agerList ){.    
14db0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14dc0 33 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65  3PagerList->pPre
14dd0 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  v==0 );.      sq
14de0 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d 3e  lite3PagerList->
14df0 70 50 72 65 76 20 3d 20 70 50 61 67 65 72 3b 0a  pPrev = pPager;.
14e00 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
14e10 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
14e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
14e30 74 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  t = pPager;.    
14e40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14e50 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  ave(mutex);.  }.
14e60 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
14e70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14e80 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
14e90 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f   handler functio
14ea0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
14eb0 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
14ec0 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61  ndler(Pager *pPa
14ed0 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72  ger, BusyHandler
14ee0 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b   *pBusyHandler){
14ef0 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
14f00 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48  Handler = pBusyH
14f10 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  andler;.}../*.**
14f20 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63   Set the destruc
14f30 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  tor for this pag
14f40 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
14f50 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  , the destructor
14f60 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68   is called.** wh
14f70 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
14f80 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70   count on each p
14f90 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f  age reaches zero
14fa0 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  .  The destructo
14fb0 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64  r can.** be used
14fc0 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66   to clean up inf
14fd0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
14fe0 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70  extra segment ap
14ff0 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70  pended to each p
15000 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  age..**.** The d
15010 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74  estructor is not
15020 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73   called as a res
15030 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  ult sqlite3Pager
15040 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65  Close().  .** De
15050 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e  structors are on
15060 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c  ly called by sql
15070 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
15080 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15090 33 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63  3PagerSetDestruc
150a0 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  tor(Pager *pPage
150b0 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29  r, void (*xDesc)
150c0 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a  (DbPage*,int)){.
150d0 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
150e0 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d  uctor = xDesc;.}
150f0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
15100 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f  reinitializer fo
15110 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
15120 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
15130 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a  reinitializer.**
15140 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
15150 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
15160 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69   page in cache i
15170 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
15180 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61  s original.** va
15190 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  lue as a result 
151a0 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20  of a rollback.  
151b0 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76  The callback giv
151c0 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  es higher-level 
151d0 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72  code.** an oppor
151e0 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72  tunity to restor
151f0 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74  e the EXTRA sect
15200 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74  ion to agree wit
15210 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a  h the restored.*
15220 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  * page data..*/.
15230 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
15240 72 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67  rSetReiniter(Pag
15250 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
15260 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
15270 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  ge*,int)){.  pPa
15280 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
15290 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a   xReinit;.}../*.
152a0 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20  ** Set the page 
152b0 73 69 7a 65 20 74 6f 20 2a 70 50 61 67 65 53 69  size to *pPageSi
152c0 7a 65 2e 20 49 66 20 74 68 65 20 73 75 67 67 65  ze. If the sugge
152d0 73 74 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  st new page size
152e0 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72   is.** inappropr
152f0 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
15300 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
15310 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
15320 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f  at.** value befo
15330 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
15340 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
15350 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
15360 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20  er *pPager, u16 
15370 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69  *pPageSize){.  i
15380 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15390 4b 3b 0a 20 20 75 31 36 20 70 61 67 65 53 69 7a  K;.  u16 pageSiz
153a0 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
153b0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
153c0 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
153d0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
153e0 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
153f0 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
15400 69 66 28 20 70 61 67 65 53 69 7a 65 20 26 26 20  if( pageSize && 
15410 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72  pageSize!=pPager
15420 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 26  ->pageSize .   &
15430 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  & !pPager->memDb
15440 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   && pPager->nRef
15450 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 63 68  ==0 .  ){.    ch
15460 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72  ar *pNew = (char
15470 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
15480 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  c(pageSize);.   
15490 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20   if( !pNew ){.  
154a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
154b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
154c0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 45 6e 74  {.      pagerEnt
154d0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
154e0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
154f0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
15500 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
15510 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
15520 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
15530 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
15540 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
15550 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
15560 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
15570 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
15580 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
15590 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
155a0 7d 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d  }.  *pPageSize =
155b0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
155c0 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
155d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
155e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
155f0 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65   "temporary page
15600 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e  " buffer held in
15610 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74  ternally.** by t
15620 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
15630 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74  is a buffer that
15640 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74   is big enough t
15650 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e  o hold the.** en
15660 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
15670 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
15680 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73    This buffer is
15690 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
156a0 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  .** during rollb
156b0 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  ack and will be 
156c0 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e  overwritten when
156d0 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ever a rollback.
156e0 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20  ** occurs.  But 
156f0 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72  other modules ar
15700 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74  e free to use it
15710 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73   too, as long as
15720 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73  .** no rollbacks
15730 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a   are happening..
15740 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
15750 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50  PagerTempSpace(P
15760 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
15770 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
15780 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a  pTmpSpace;.}../*
15790 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
157a0 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  et the maximum d
157b0 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
157c0 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  nt if mxPage is 
157d0 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61  positive. .** Ma
157e0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
157f0 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20   mxPage is zero 
15800 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e  or negative.  An
15810 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  d never reduce t
15820 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61  he.** maximum pa
15830 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74  ge count below t
15840 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
15850 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
15860 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  .**.** Regardles
15870 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  s of mxPage, ret
15880 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
15890 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
158a0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
158b0 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
158c0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
158d0 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
158e0 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29    if( mxPage>0 )
158f0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
15900 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Pgno = mxPage;. 
15910 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65   }.  sqlite3Page
15920 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
15930 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r);.  return pPa
15940 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
15950 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
15960 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
15970 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
15980 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
15990 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
159a0 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
159b0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
159c0 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
159d0 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
159e0 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
159f0 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
15a00 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
15a10 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
15a20 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
15a30 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
15a40 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
15a50 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
15a60 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
15a70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
15a80 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
15a90 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
15aa0 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
15ab0 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
15ac0 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
15ad0 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
15ae0 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
15af0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
15b00 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
15b10 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
15b20 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
15b30 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
15b40 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
15b50 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
15b60 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
15b70 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
15b80 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
15b90 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
15ba0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
15bb0 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
15bc0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
15bd0 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
15be0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
15bf0 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
15c00 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
15c10 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
15c20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
15c30 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
15c40 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
15c50 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
15c60 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20  .**.** No error 
15c70 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
15c80 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66  . The rational f
15c90 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
15ca0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  this function .*
15cb0 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  * may be called 
15cc0 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65  even if the file
15cd0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
15ce0 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61  or contain a hea
15cf0 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73  der. In .** thes
15d00 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f  e cases sqlite3O
15d10 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74  sRead() will ret
15d20 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f  urn an error, to
15d30 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65   which the corre
15d40 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20  ct .** response 
15d50 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d  is to zero the m
15d60 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61  emory at pDest a
15d70 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20  nd continue.  A 
15d80 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a  real IO error .*
15d90 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c  * will presumabl
15da0 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70  y recur and be p
15db0 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28  icked up later (
15dc0 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75  Todo: Think abou
15dd0 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20  t this)..*/.int 
15de0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
15df0 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  Fileheader(Pager
15e00 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
15e10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
15e20 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
15e30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15e40 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
15e50 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 4d 45   N);.  assert(ME
15e60 4d 44 42 7c 7c 70 50 61 67 65 72 2d 3e 66 64 2d  MDB||pPager->fd-
15e70 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
15e80 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
15e90 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
15ea0 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
15eb0 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
15ec0 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
15ed0 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
15ee0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
15ef0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
15f00 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
15f10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
15f20 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
15f30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15f40 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
15f50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15f60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
15f70 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
15f80 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69   pages in the di
15f90 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  sk file associat
15fa0 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65  ed with.** pPage
15fb0 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r. .**.** If the
15fc0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69   PENDING_BYTE li
15fd0 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64  es on the page d
15fe0 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68  irectly after th
15ff0 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
16000 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69  file, then consi
16010 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61  der this page pa
16020 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  rt of the file t
16030 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  oo. For example,
16040 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42   if.** PENDING_B
16050 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36  YTE is byte 4096
16060 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
16070 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20   of page 5) and 
16080 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
16090 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20  ** file is 4096 
160a0 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75  bytes, 5 is retu
160b0 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  rned instead of 
160c0 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  4..*/.int sqlite
160d0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
160e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
160f0 20 20 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69    i64 n = 0;.  i
16100 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
16110 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
16120 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
16130 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
16140 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n -1;.  }.  if( 
16150 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
16160 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61  0 ){.    n = pPa
16170 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
16180 20 65 6c 73 65 20 7b 0a 20 20 20 20 61 73 73 65   else {.    asse
16190 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
161a0 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
161b0 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
161c0 69 66 28 20 28 70 50 61 67 65 72 2d 3e 66 64 2d  if( (pPager->fd-
161d0 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20 20 20 20  >pMethods).     
161e0 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
161f0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
16200 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c  r->fd, &n))!=SQL
16210 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16220 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
16230 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
16240 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
16250 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
16260 66 2d 2d 3b 0a 20 20 20 20 20 20 72 65 74 75 72  f--;.      retur
16270 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
16280 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61  if( n>0 && n<pPa
16290 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
162a0 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20  .      n = 1;.  
162b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
162c0 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /= pPager->page
162d0 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
162e0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
162f0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
16300 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
16310 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20  >dbSize = n;.   
16320 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d   }.  }.  if( n==
16330 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  (PENDING_BYTE/pP
16340 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
16350 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
16360 20 20 69 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e    if( n>pPager->
16370 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
16380 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e  ager->mxPgno = n
16390 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
163a0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
163b0 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
163c0 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  DB./*.** Clear a
163d0 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b   PgHistory block
163e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
163f0 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48  clearHistory(PgH
16400 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a  istory *pHist){.
16410 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
16420 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20  Hist->pOrig);.  
16430 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69  sqlite3_free(pHi
16440 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48  st->pStmt);.  pH
16450 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a  ist->pOrig = 0;.
16460 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
16470 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66   0;.}.#else.#def
16480 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79  ine clearHistory
16490 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
164a0 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
164b0 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
164c0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
164d0 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  Pager*);../*.** 
164e0 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
164f0 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  its hash chain. 
16500 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70 61 67  Also set the pag
16510 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f  e number to 0 to
16520 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61   indicate.** tha
16530 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
16540 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  t part of any ha
16550 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69  sh chain. This i
16560 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75  s required becau
16570 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  se the.** sqlite
16580 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29  3PagerMovepage()
16590 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61   routine can lea
165a0 76 65 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  ve a page in the
165b0 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70   .** pNextFree/p
165c0 50 72 65 76 46 72 65 65 20 6c 69 73 74 20 74 68  PrevFree list th
165d0 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74  at is not a part
165e0 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61   of any hash-cha
165f0 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
16600 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  id unlinkHashCha
16610 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
16620 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
16630 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
16640 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
16650 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d   pPg->pNextHash=
16660 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76  =0 && pPg->pPrev
16670 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Hash==0 );.    r
16680 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
16690 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
166a0 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
166b0 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
166c0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
166d0 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  h;.  }.  if( pPg
166e0 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
166f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
16700 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70 67  r->aHash[pPg->pg
16710 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
16720 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a  ash-1)]!=pPg );.
16730 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61      pPg->pPrevHa
16740 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  sh->pNextHash = 
16750 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
16760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
16770 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26   h = pPg->pgno &
16780 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
16790 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  1);.    pPager->
167a0 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e  aHash[h] = pPg->
167b0 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
167c0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
167d0 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50    clearHistory(P
167e0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
167f0 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a  , pPager));.  }.
16800 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b    pPg->pgno = 0;
16810 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
16820 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
16830 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sh = 0;.}../*.**
16840 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66   Unlink a page f
16850 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
16860 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61  t (the list of a
16870 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20 6e  ll pages where n
16880 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66  Ref==0).** and f
16890 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c  rom its hash col
168a0 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f  lision chain..*/
168b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
168c0 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  inkPage(PgHdr *p
168d0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
168e0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
168f0 65 72 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b  er;..  /* Unlink
16900 20 66 72 6f 6d 20 66 72 65 65 20 70 61 67 65 20   from free page 
16910 6c 69 73 74 20 2a 2f 0a 20 20 6c 72 75 4c 69 73  list */.  lruLis
16920 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 0a 20  tRemove(pPg);.. 
16930 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
16940 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61  the pgno hash ta
16950 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ble */.  unlinkH
16960 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
16970 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pPg);.}../*.** 
16980 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
16990 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65  used to truncate
169a0 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
169b0 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73  a database.** is
169c0 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f   truncated.  Dro
169d0 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  p from the cache
169e0 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65   all pages whose
169f0 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67   pgno is.** larg
16a00 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
16a10 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e  dbSize and is un
16a20 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a  referenced..**.*
16a30 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67  * Referenced pag
16a40 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  es larger than p
16a50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72  Pager->dbSize ar
16a60 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
16a70 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65  Actually, at the
16a80 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74   point this rout
16a90 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ine is called, i
16aa0 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e  t would be.** an
16ab0 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61   error to have a
16ac0 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   referenced page
16ad0 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74 68  .  But rather th
16ae0 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61  an delete.** tha
16af0 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72 61  t page and guara
16b00 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65 6e  ntee a subsequen
16b10 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73  t segfault, it s
16b20 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74  eems better.** t
16b30 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f  o zero it and ho
16b40 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f 72  pe that we error
16b50 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a   out sanely..*/.
16b60 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
16b70 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
16b80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
16b90 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
16ba0 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20   PgHdr **ppPg;. 
16bb0 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50   int dbSize = pP
16bc0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
16bd0 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d   ppPg = &pPager-
16be0 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  >pAll;.  while( 
16bf0 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30  (pPg = *ppPg)!=0
16c00 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   ){.    if( pPg-
16c10 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b  >pgno<=dbSize ){
16c20 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
16c30 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
16c40 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d    }else if( pPg-
16c50 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20  >nRef>0 ){.     
16c60 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
16c70 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
16c80 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
16c90 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  ;.      ppPg = &
16ca0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
16cb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16cc0 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65  *ppPg = pPg->pNe
16cd0 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54  xtAll;.      IOT
16ce0 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70  RACE(("PGFREE %p
16cf0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
16d00 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
16d10 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
16d20 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
16d30 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ee_count);.     
16d40 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
16d50 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  ;.      makeClea
16d60 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71  n(pPg);.      sq
16d70 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 2d 3e  lite3_free(pPg->
16d80 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71  pData);.      sq
16d90 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b  lite3_free(pPg);
16da0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
16db0 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
16dc0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  }.}../*.** Try t
16dd0 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
16de0 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f  on a file.  Invo
16df0 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
16e00 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
16e10 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
16e20 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
16e30 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68   Repeat until th
16e40 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
16e50 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65  returns.** false
16e60 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f   or until the lo
16e70 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
16e80 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
16e90 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
16ea0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
16eb0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
16ec0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
16ed0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16ee0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
16ef0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
16f00 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
16f10 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
16f20 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c   The OS lock val
16f30 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20  ues must be the 
16f40 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65  same as the Page
16f50 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f  r lock values */
16f60 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
16f70 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
16f80 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
16f90 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
16fa0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
16fb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
16fc0 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
16fd0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
16fe0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
16ff0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
17000 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65  nlocked then the
17010 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e   size must be un
17020 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72  known */.  asser
17030 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
17040 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
17050 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
17060 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a  <0 || MEMDB );..
17070 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17080 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ate>=locktype ){
17090 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
170a0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
170b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
170c0 75 73 79 48 61 6e 64 6c 65 72 20 29 20 70 50 61  usyHandler ) pPa
170d0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
170e0 72 2d 3e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  r->nBusy = 0;.  
170f0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
17100 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
17110 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
17120 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
17130 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
17140 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76  SY && sqlite3Inv
17150 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
17160 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
17170 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ler) );.    if( 
17180 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17190 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
171a0 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  tate = locktype;
171b0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
171c0 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
171d0 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
171e0 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
171f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17200 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
17210 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  file to the numb
17220 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63  er of pages spec
17230 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ified..*/.int sq
17240 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
17250 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
17260 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
17270 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
17280 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
17290 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
172a0 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c  | MEMDB );.  sql
172b0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
172c0 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  nt(pPager);.  if
172d0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
172e0 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
172f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
17300 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17310 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28  }.  if( nPage>=(
17320 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
17330 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
17340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17350 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
17360 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
17370 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
17380 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
17390 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
173a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
173b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 61  ITE_OK;.  }.  pa
173c0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
173d0 3b 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  ;.  rc = syncJou
173e0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
173f0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
17400 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
17410 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17420 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
17430 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75   /* Get an exclu
17440 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
17450 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
17460 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a   truncating. */.
17470 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
17480 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ger);.  rc = pag
17490 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
174a0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
174b0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 70 61 67 65 72  E_LOCK);.  pager
174c0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
174d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
174e0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
174f0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d   rc;.  }..  rc =
17500 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
17510 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
17520 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17530 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
17540 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
17550 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
17560 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
17570 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
17580 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
17590 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
175a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
175b0 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
175c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
175d0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
175e0 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
175f0 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
17600 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
17610 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
17620 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
17630 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
17640 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
17650 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
17660 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
17670 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
17680 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
17690 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
176a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
176b0 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
176c0 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
176d0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
176e0 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
176f0 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
17700 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
17710 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
17720 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
17730 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
17740 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
17750 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
17760 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
17770 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
17780 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
17790 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
177a0 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
177b0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
177c0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
177d0 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20  ANAGEMENT.  if( 
177e0 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71  !MEMDB ){.    sq
177f0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
17800 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
17810 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
17820 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
17830 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  2);.    sqlite3_
17840 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
17850 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  x);.    if( pPag
17860 65 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  er->pPrev ){.   
17870 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76     pPager->pPrev
17880 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72  ->pNext = pPager
17890 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
178a0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
178b0 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61  3PagerList = pPa
178c0 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ger->pNext;.    
178d0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
178e0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
178f0 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 2d 3e   pPager->pNext->
17900 70 50 72 65 76 20 3d 20 70 50 61 67 65 72 2d 3e  pPrev = pPager->
17910 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  pPrev;.    }.   
17920 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
17930 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d  eave(mutex);.  }
17940 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62  .#endif..  disab
17950 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
17960 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
17970 74 65 33 46 61 75 6c 74 42 65 6e 69 67 6e 28 2d  te3FaultBenign(-
17980 31 2c 20 31 29 3b 0a 20 20 70 50 61 67 65 72 2d  1, 1);.  pPager-
17990 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  >errCode = 0;.  
179a0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
179b0 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67  eMode = 0;.  pag
179c0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
179d0 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  ;.  pagerUnlockA
179e0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
179f0 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d  r);.  enable_sim
17a00 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
17a10 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 61 75  ();.  sqlite3Fau
17a20 6c 74 42 65 6e 69 67 6e 28 2d 31 2c 20 30 29 3b  ltBenign(-1, 0);
17a30 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
17a40 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
17a50 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
17a60 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
17a70 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
17a80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
17a90 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
17aa0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
17ab0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
17ac0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76   }.  sqlite3Bitv
17ad0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
17ae0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
17af0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
17b00 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  tOpen ){.    sql
17b10 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
17b20 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20  er->stfd);.  }. 
17b30 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
17b40 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f  pPager->fd);.  /
17b50 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65  * Temp files are
17b60 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
17b70 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53  eleted by the OS
17b80 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72  .  ** if( pPager
17b90 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
17ba0 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  **   sqlite3OsDe
17bb0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
17bc0 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
17bd0 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f    */..  sqlite3_
17be0 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  free(pPager->aHa
17bf0 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  sh);.  sqlite3_f
17c00 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
17c10 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65  Space);.  sqlite
17c20 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
17c30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17c40 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
17c50 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
17c60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
17c70 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
17c80 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
17c90 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
17ca0 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e  age data..*/.Pgn
17cb0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
17cc0 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
17cd0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
17ce0 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a  >pgno;.}.#endif.
17cf0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f  ./*.** The page_
17d00 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ref() function i
17d10 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65  ncrements the re
17d20 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
17d30 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20  r a page..** If 
17d40 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  the page is curr
17d50 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
17d60 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72  elist (the refer
17d70 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
17d80 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f  ro) then.** remo
17d90 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66  ve it from the f
17da0 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46  reelist..**.** F
17db0 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74  or non-test syst
17dc0 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20  ems, page_ref() 
17dd0 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20  is a macro that 
17de0 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28  calls _page_ref(
17df0 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74  ).** online of t
17e00 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
17e10 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72  nt is zero.  For
17e20 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70   test systems, p
17e30 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20  age_ref().** is 
17e40 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
17e50 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  so that we can s
17e60 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61  et breakpoints a
17e70 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a  nd trace it..*/.
17e80 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67  static void _pag
17e90 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
17ea0 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  ){.  if( pPg->nR
17eb0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ef==0 ){.    /* 
17ec0 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  The page is curr
17ed0 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
17ee0 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69  elist.  Remove i
17ef0 74 2e 20 2a 2f 0a 20 20 20 20 6c 72 75 4c 69 73  t. */.    lruLis
17f00 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20  tRemove(pPg);.  
17f10 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e    pPg->pPager->n
17f20 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67  Ref++;.  }.  pPg
17f30 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 23 69 66 64  ->nRef++;.}.#ifd
17f40 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
17f50 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
17f60 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
17f70 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  g){.    if( pPg-
17f80 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
17f90 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29    _page_ref(pPg)
17fa0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17fb0 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a     pPg->nRef++;.
17fc0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
17fd0 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65  # define page_re
17fe0 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65  f(P)   ((P)->nRe
17ff0 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50  f==0?_page_ref(P
18000 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65  ):(void)(P)->nRe
18010 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  f++).#endif../*.
18020 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
18030 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
18040 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68   for a page.  Th
18050 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20  e input pointer 
18060 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  is.** a referenc
18070 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61  e to the page da
18080 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ta..*/.int sqlit
18090 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67  e3PagerRef(DbPag
180a0 65 20 2a 70 50 67 29 7b 0a 20 20 70 61 67 65 72  e *pPg){.  pager
180b0 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61 67 65  Enter(pPg->pPage
180c0 72 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  r);.  page_ref(p
180d0 50 67 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  Pg);.  pagerLeav
180e0 65 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pPg->pPager);.
180f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18100 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
18110 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  c the journal.  
18120 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
18130 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
18140 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
18150 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
18160 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
18170 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
18180 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
18190 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
181a0 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61  k.  It is not sa
181b0 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  fe to modify the
181c0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
181d0 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66  se file until af
181e0 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ter.** the journ
181f0 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  al has been sync
18200 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67  ed.  If the orig
18210 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  inal database is
18220 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65   modified before
18230 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
18240 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20  is synced and a 
18250 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
18260 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63  curs, the unsync
18270 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61  ed journal.** da
18280 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74  ta would be lost
18290 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65   and we would be
182a0 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c   unable to compl
182b0 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74  etely rollback t
182c0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
182d0 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73  hanges.  Databas
182e0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75  e corruption wou
182f0 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a  ld occur..** .**
18300 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
18310 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e  so updates the n
18320 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
18330 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
18340 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20  ournal..** (See 
18350 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  comments on the 
18360 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
18370 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
18380 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
18390 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20  ion.).** If the 
183a0 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c  sync mode is FUL
183b0 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c  L, two syncs wil
183c0 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20  l occur.  First 
183d0 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
183e0 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20  l.** is synced, 
183f0 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
18400 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20  eld is updated, 
18410 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79  then a second sy
18420 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
18430 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   For temporary d
18440 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20  atabases, we do 
18450 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61  not care if we a
18460 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  re able to rollb
18470 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70  ack.** after a p
18480 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f  ower failure, so
18490 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   no sync occurs.
184a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f  .**.** If the IO
184b0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 66  CAP_SEQUENTIAL f
184c0 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 74  lag is set for t
184d0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
184e0 64 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20  dia on which.** 
184f0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
18500 73 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73 53  stored, then OsS
18510 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
18520 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  alled on the jou
18530 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e  rnal.** file. In
18540 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 74   this case all t
18550 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
18560 69 73 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  is to update the
18570 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a   nRec field in.*
18580 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
18590 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ader..**.** This
185a0 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
185b0 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65  the needSync fie
185c0 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  ld of every page
185d0 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e   current held in
185e0 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
185f0 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
18600 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
18610 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
18620 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
18630 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a  QLITE_OK;...  /*
18640 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
18650 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  l before modifyi
18660 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ng the main data
18670 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d  base.  ** (assum
18680 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a  ing there is a j
18690 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65  ournal and it ne
186a0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eds to be synced
186b0 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  .).  */.  if( pP
186c0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
186d0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
186e0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
186f0 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
18700 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
18710 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
18720 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
18730 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18740 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
18750 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
18760 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
18770 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
18780 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
18790 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
187a0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
187b0 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
187c0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
187d0 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
187e0 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
187f0 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
18800 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
18810 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
18820 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
18830 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
18840 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
18850 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
18860 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
18870 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
18880 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
18890 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
188a0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
188b0 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65   if the persiste
188c0 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74  nt media support
188d0 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  s the.        **
188e0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
188f0 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69  perty. Because i
18900 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69  n this case it i
18910 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a  s not possible .
18920 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67          ** for g
18930 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62  arbage data to b
18940 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
18950 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63  e file, the nRec
18960 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a   field.        *
18970 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  * is populated w
18980 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77  ith 0xFFFFFFFF w
18990 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
189a0 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
189b0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64  n.        ** and
189c0 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20   never needs to 
189d0 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
189e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
189f0 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 20 20  64 jrnlOff;.    
18a00 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
18a10 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
18a20 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
18a30 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
18a40 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
18a50 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
18a60 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
18a70 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
18a80 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
18a90 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
18aa0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
18ab0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18ac0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
18ad0 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
18ae0 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  _flags);.       
18af0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
18b00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18b10 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e    }..        jrn
18b20 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
18b30 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
18b40 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
18b50 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
18b60 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
18b70 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
18b80 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20   jrnlOff, 4));. 
18b90 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
18ba0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
18bb0 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50  jfd, jrnlOff, pP
18bc0 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
18bd0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
18be0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
18bf0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
18c00 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
18c10 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
18c20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
18c30 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
18c40 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
18c50 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
18c60 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
18c70 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
18c80 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
18c90 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
18ca0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
18cb0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c  ger->sync_flags|
18cc0 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
18cd0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d  ger->sync_flags=
18ce0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
18cf0 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
18d00 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
18d10 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
18d20 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
18d30 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
18d40 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
18d50 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
18d60 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
18d70 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
18d80 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20     /* Erase the 
18d90 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72  needSync flag fr
18da0 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20  om every page.. 
18db0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50     */.    for(pP
18dc0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
18dd0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
18de0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
18df0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
18e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 72 75 4c  ;.    }.    lruL
18e10 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65  istSetFirstSynce
18e20 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  d(pPager);.  }..
18e30 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
18e40 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72   /* If the Pager
18e50 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
18e60 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65  s clear then the
18e70 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
18e80 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61    ** flag must a
18e90 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72  lso be clear for
18ea0 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72   all pages.  Ver
18eb0 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  ify that this.  
18ec0 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  ** invariant is 
18ed0 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  true..  */.  els
18ee0 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  e{.    for(pPg=p
18ef0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
18f00 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
18f10 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65  All){.      asse
18f20 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
18f30 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  c==0 );.    }.  
18f40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18f50 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
18f60 65 64 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e  ed==pPager->lru.
18f70 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65  pFirst );.  }.#e
18f80 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
18f90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  c;.}../*.** Merg
18fa0 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70  e two lists of p
18fb0 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  ages connected b
18fc0 79 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20  y pDirty and in 
18fd0 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44  pgno order..** D
18fe0 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e  o not both fixin
18ff0 67 20 74 68 65 20 70 50 72 65 76 44 69 72 74 79  g the pPrevDirty
19000 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74   pointers..*/.st
19010 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67  atic PgHdr *merg
19020 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
19030 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29   *pA, PgHdr *pB)
19040 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c 74  {.  PgHdr result
19050 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69  , *pTail;.  pTai
19060 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77  l = &result;.  w
19070 68 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29  hile( pA && pB )
19080 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67  {.    if( pA->pg
19090 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20  no<pB->pgno ){. 
190a0 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
190b0 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  ty = pA;.      p
190c0 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20  Tail = pA;.     
190d0 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79   pA = pA->pDirty
190e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
190f0 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
19100 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61   = pB;.      pTa
19110 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  il = pB;.      p
19120 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a  B = pB->pDirty;.
19130 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
19140 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pA ){.    pTail-
19150 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20  >pDirty = pA;.  
19160 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a  }else if( pB ){.
19170 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
19180 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b  y = pB;.  }else{
19190 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
191a0 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
191b0 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72  turn result.pDir
191c0 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72  ty;.}../*.** Sor
191d0 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  t the list of pa
191e0 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
191f0 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20   order by pgno. 
19200 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   Pages are.** co
19210 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
19220 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65  y pointers.  The
19230 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
19240 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72  ters are.** corr
19250 75 70 74 65 64 20 62 79 20 74 68 69 73 20 73 6f  upted by this so
19260 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  rt..*/.#define N
19270 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
19280 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f  OC 25.#define N_
19290 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20 20 20  SORT_BUCKET     
192a0 20 20 32 35 0a 23 69 66 64 65 66 20 53 51 4c 49    25.#ifdef SQLI
192b0 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71  TE_TEST.  int sq
192c0 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
192d0 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20  rt_bucket = 0;. 
192e0 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42   #undef N_SORT_B
192f0 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e 65 20  UCKET.  #define 
19300 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a  N_SORT_BUCKET \.
19310 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61 67 65     (sqlite3_page
19320 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f  r_n_sort_bucket?
19330 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
19340 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f  sort_bucket:N_SO
19350 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29  RT_BUCKET_ALLOC)
19360 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 50  .#endif.static P
19370 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c  gHdr *sort_pagel
19380 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b  ist(PgHdr *pIn){
19390 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f  .  PgHdr *a[N_SO
193a0 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d  RT_BUCKET_ALLOC]
193b0 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  , *p;.  int i;. 
193c0 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69   memset(a, 0, si
193d0 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c  zeof(a));.  whil
193e0 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20  e( pIn ){.    p 
193f0 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d  = pIn;.    pIn =
19400 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
19410 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
19420 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f     for(i=0; i<N_
19430 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69  SORT_BUCKET-1; i
19440 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
19450 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
19460 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20    a[i] = p;.    
19470 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19490 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  p = merge_pageli
194a0 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  st(a[i], p);.   
194b0 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20       a[i] = 0;. 
194c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
194d0 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42   if( i==N_SORT_B
194e0 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20  UCKET-1 ){.     
194f0 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 54 6f   /* Coverage: To
19500 20 67 65 74 20 68 65 72 65 2c 20 74 68 65 72 65   get here, there
19510 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e 28 4e   need to be 2^(N
19520 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a 20  _SORT_BUCKET) . 
19530 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73       ** elements
19540 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 69   in the input li
19550 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f 73 73  st. This is poss
19560 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72 61 63  ible, but imprac
19570 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20  tical..      ** 
19580 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c 69 6e  Testing this lin
19590 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74 20 6f  e is the point o
195a0 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  f global variabl
195b0 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
195c0 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
195d0 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f  bucket..      */
195e0 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65  .      a[i] = me
195f0 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69  rge_pagelist(a[i
19600 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], p);.    }.  }
19610 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66  .  p = a[0];.  f
19620 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54  or(i=1; i<N_SORT
19630 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20  _BUCKET; i++){. 
19640 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67     p = merge_pag
19650 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a  elist(p, a[i]);.
19660 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
19670 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
19680 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28   list of pages (
19690 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65  connected by the
196a0 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
196b0 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20  inter) write.** 
196c0 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f  every one of tho
196d0 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20  se pages out to 
196e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
196f0 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20  e and mark them 
19700 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e  all.** as clean.
19710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19720 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
19730 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
19740 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
19750 65 72 3b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  er;.  PgHdr *p;.
19760 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
19770 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
19780 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19790 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e  pPager = pList->
197a0 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74  pPager;..  /* At
197b0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
197c0 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  e may be either 
197d0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
197e0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
197f0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
19800 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
19810 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45   is already an E
19820 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74  XCLUSIVE lock, t
19830 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
19840 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
19850 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e  e3OsLock() are n
19860 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  o-ops..  **.  **
19870 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
19880 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
19890 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
198a0 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
198b0 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
198c0 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
198d0 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
198e0 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
198f0 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
19900 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
19910 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
19920 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
19930 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
19940 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
19950 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
19960 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
19970 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
19980 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
19990 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
199a0 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
199b0 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
199c0 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
199d0 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
199e0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
199f0 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
19a00 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
19a10 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
19a20 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
19a30 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
19a40 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
19a50 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
19a60 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
19a70 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
19a80 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
19a90 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
19aa0 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
19ab0 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
19ac0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
19ad0 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
19ae0 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
19af0 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
19b00 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
19b10 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63  yback..  */.  rc
19b20 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
19b30 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
19b40 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
19b50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19b60 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
19b70 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73   rc;.  }..  pLis
19b80 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c 69 73  t = sort_pagelis
19b90 74 28 70 4c 69 73 74 29 3b 0a 20 20 66 6f 72 28  t(pList);.  for(
19ba0 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
19bb0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73  >pDirty){.    as
19bc0 73 65 72 74 28 20 70 2d 3e 64 69 72 74 79 20 29  sert( p->dirty )
19bd0 3b 0a 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d  ;.    p->dirty =
19be0 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   0;.  }.  while(
19bf0 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20 20 20 2f   pList ){..    /
19c00 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61  * If the file ha
19c10 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
19c20 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
19c30 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  ow. */.    if( !
19c40 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
19c50 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 61 73  hods ){.      as
19c60 73 65 72 74 28 70 50 61 67 65 72 2d 3e 74 65 6d  sert(pPager->tem
19c70 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 63  pFile);.      rc
19c80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
19c90 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2d 3e  pentemp(pPager->
19ca0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 66 64  pVfs, pPager->fd
19cb0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
19cc0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ce0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73       pPager->vfs
19cf0 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
19d00 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
19d10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19d20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
19d30 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
19d40 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
19d50 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
19d60 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
19d70 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
19d80 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
19d90 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 29  3PagerTruncate()
19da0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
19db0 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
19dc0 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
19dd0 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
19de0 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
19df0 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
19e00 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
19e10 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
19e20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69    */.    if( pLi
19e30 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  st->pgno<=pPager
19e40 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
19e50 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
19e60 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
19e70 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
19e80 53 69 7a 65 3b 0a 20 20 20 20 20 20 63 68 61 72  Size;.      char
19e90 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32   *pData = CODEC2
19ea0 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
19eb0 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70  O_DATA(pList), p
19ec0 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a  List->pgno, 6);.
19ed0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
19ee0 34 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  4("STORE %d page
19ef0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
19f00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
19f10 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
19f20 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
19f30 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
19f40 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20 20 20  sh(pList));.    
19f50 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
19f60 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
19f70 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
19f80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
19f90 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
19fa0 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
19fb0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19fc0 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
19fd0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
19fe0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
19ff0 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  b_count);.      
1a000 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1a010 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
1a020 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
1a030 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
1a040 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1a050 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
1a060 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
1a070 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1a080 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
1a090 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
1a0a0 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
1a0b0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4e    PAGERTRACE3("N
1a0c0 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
1a0d0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1a0e0 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
1a0f0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  no);.    }.#endi
1a100 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  f.    if( rc ) r
1a110 65 74 75 72 6e 20 72 63 3b 0a 23 69 66 64 65 66  eturn rc;.#ifdef
1a120 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1a130 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
1a140 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
1a150 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
1a160 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
1a170 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
1a180 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
1a190 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1a1a0 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72  .** Collect ever
1a1b0 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74  y dirty page int
1a1c0 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61  o a dirty list a
1a1d0 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70  nd.** return a p
1a1e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
1a1f0 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e  ad of that list.
1a200 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a    All pages are.
1a210 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65  ** collected eve
1a220 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74  n if they are st
1a230 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  ill in use..*/.s
1a240 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
1a250 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
1a260 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  _pages(Pager *pP
1a270 61 67 65 72 29 7b 0a 0a 23 69 66 6e 64 65 66 20  ager){..#ifndef 
1a280 4e 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  NDEBUG.  /* Veri
1a290 66 79 20 74 68 65 20 73 61 6e 69 74 79 20 6f 66  fy the sanity of
1a2a0 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 20   the dirty list 
1a2b0 77 68 65 6e 20 77 65 20 61 72 65 20 72 75 6e 6e  when we are runn
1a2c0 69 6e 67 0a 20 20 2a 2a 20 69 6e 20 64 65 62 75  ing.  ** in debu
1a2d0 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 54 68 69  gging mode.  Thi
1a2e0 73 20 69 73 20 65 78 70 65 6e 73 69 76 65 2c 20  s is expensive, 
1a2f0 73 6f 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 64  so do not.  ** d
1a300 6f 20 74 68 69 73 20 6f 6e 20 61 20 6e 6f 72 6d  o this on a norm
1a310 61 6c 20 62 75 69 6c 64 2e 20 2a 2f 0a 20 20 69  al build. */.  i
1a320 6e 74 20 6e 31 20 3d 20 30 3b 0a 20 20 69 6e 74  nt n1 = 0;.  int
1a330 20 6e 32 20 3d 20 30 3b 0a 20 20 50 67 48 64 72   n2 = 0;.  PgHdr
1a340 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61   *p;.  for(p=pPa
1a350 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
1a360 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 20 69 66  p->pNextAll){ if
1a370 28 20 70 2d 3e 64 69 72 74 79 20 29 20 6e 31 2b  ( p->dirty ) n1+
1a380 2b 3b 20 7d 0a 20 20 66 6f 72 28 70 3d 70 50 61  +; }.  for(p=pPa
1a390 67 65 72 2d 3e 70 44 69 72 74 79 3b 20 70 3b 20  ger->pDirty; p; 
1a3a0 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 20 6e 32  p=p->pDirty){ n2
1a3b0 2b 2b 3b 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ++; }.  assert( 
1a3c0 6e 31 3d 3d 6e 32 20 29 3b 0a 23 65 6e 64 69 66  n1==n2 );.#endif
1a3d0 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ..  return pPage
1a3e0 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  r->pDirty;.}../*
1a3f0 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
1a400 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
1a410 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
1a420 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
1a430 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
1a440 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
1a450 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
1a460 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
1a470 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
1a480 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a490 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
1a4a0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
1a4b0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
1a4c0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
1a4d0 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
1a4e0 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
1a4f0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
1a500 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
1a510 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1a520 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  al..**.** Return
1a530 20 6e 65 67 61 74 69 76 65 20 69 66 20 75 6e 61   negative if una
1a540 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
1a550 20 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74   the status of t
1a560 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
1a570 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
1a580 6f 65 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65  oes not open the
1a590 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
1a5a0 20 65 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20   examine its.** 
1a5b0 63 6f 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c  content.  Hence,
1a5c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
1a5d0 68 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  ht contain the n
1a5e0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 0a  ame of a master.
1a5f0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1a600 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 64 65  that has been de
1a610 6c 65 74 65 64 2c 20 61 6e 64 20 68 65 6e 63 65  leted, and hence
1a620 20 6e 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f 72   not be hot.  Or
1a630 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f  .** the header o
1a640 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  f the journal mi
1a650 67 68 74 20 62 65 20 7a 65 72 6f 65 64 20 6f 75  ght be zeroed ou
1a660 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
1a670 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69 73  .** does not dis
1a680 63 6f 76 65 72 20 74 68 65 73 65 20 63 61 73 65  cover these case
1a690 73 20 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a  s of a non-hot j
1a6a0 6f 75 72 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a  ournal - if the.
1a6b0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1a6c0 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
1a6d0 74 20 65 6d 70 74 79 20 74 68 69 73 20 72 6f 75  t empty this rou
1a6e0 74 69 6e 65 20 61 73 73 75 6d 65 73 20 69 74 0a  tine assumes it.
1a6f0 2a 2a 20 69 73 20 68 6f 74 2e 20 20 54 68 65 20  ** is hot.  The 
1a700 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
1a710 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
1a720 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 0a  scover that the.
1a730 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1a740 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
1a750 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70  t and will no-op
1a760 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a770 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
1a780 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1a790 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1a7a0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1a7b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
1a7c0 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  ( !pPager->useJo
1a7d0 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20 30  urnal ) return 0
1a7e0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
1a7f0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 20  >fd->pMethods ) 
1a800 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
1a810 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1a820 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1a830 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
1a840 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 3b 0a  ACCESS_EXISTS);.
1a850 20 20 69 66 28 20 72 63 3c 3d 30 20 29 7b 0a 20    if( rc<=0 ){. 
1a860 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a870 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  }.  if( sqlite3O
1a880 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
1a890 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  ck(pPager->fd) )
1a8a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1a8b0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
1a8c0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1a8d0 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20  pPager)==0 ){.  
1a8e0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
1a8f0 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
1a900 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
1a910 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
1a920 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
1a930 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
1a940 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61  Try to find a pa
1a950 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
1a960 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79  that can be recy
1a970 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69  cled. .**.** Thi
1a980 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65  s routine may re
1a990 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1a9a0 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f  R, SQLITE_FULL o
1a9b0 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20  r SQLITE_OK. It 
1a9c0 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74  .** does not set
1a9d0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72   the pPager->err
1a9e0 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a  Code variable..*
1a9f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1aa00 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72  er_recycle(Pager
1aa10 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
1aa20 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72  **ppPg){.  PgHdr
1aa30 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d   *pPg;.  *ppPg =
1aa40 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20   0;..  /* It is 
1aa50 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  illegal to call 
1aa60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 6e  this function un
1aa70 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 6f  less the pager o
1aa80 62 6a 65 63 74 0a 20 20 2a 2a 20 70 6f 69 6e 74  bject.  ** point
1aa90 65 64 20 74 6f 20 62 79 20 70 50 61 67 65 72 20  ed to by pPager 
1aaa0 68 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  has at least one
1aab0 20 66 72 65 65 20 70 61 67 65 20 28 70 61 67 65   free page (page
1aac0 20 77 69 74 68 20 6e 52 65 66 3d 3d 30 29 2e 0a   with nRef==0)..
1aad0 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 21    */ .  assert(!
1aae0 4d 45 4d 44 42 29 3b 0a 20 20 61 73 73 65 72 74  MEMDB);.  assert
1aaf0 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  (pPager->lru.pFi
1ab00 72 73 74 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  rst);..  /* Find
1ab10 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63   a page to recyc
1ab20 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61  le.  Try to loca
1ab30 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64  te a page that d
1ab40 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71  oes not.  ** req
1ab50 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e  uire us to do an
1ab60 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20   fsync() on the 
1ab70 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
1ab80 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72  pPg = pPager->lr
1ab90 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a  u.pFirstSynced;.
1aba0 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c  .  /* If we coul
1abb0 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67  d not find a pag
1abc0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
1abd0 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63  require an fsync
1abe0 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a  ().  ** on the j
1abf0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
1ac00 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e   fsync the journ
1ac10 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  al file.  This i
1ac20 73 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c  s a.  ** very sl
1ac30 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f  ow operation, so
1ac40 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f   we work hard to
1ac50 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20   avoid it.  But 
1ac60 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69  sometimes.  ** i
1ac70 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65  t can't be helpe
1ac80 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
1ac90 67 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  g==0 && pPager->
1aca0 6c 72 75 2e 70 46 69 72 73 74 29 7b 0a 20 20 20  lru.pFirst){.   
1acb0 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
1acc0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1acd0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1ace0 2d 3e 66 64 29 3b 0a 20 20 20 20 69 6e 74 20 72  ->fd);.    int r
1acf0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
1ad00 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1ad10 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1ad20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ad30 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1ad40 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
1ad50 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
1ad60 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
1ad70 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e  {.      /* If in
1ad80 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
1ad90 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75   write a new jou
1ada0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f  rnal header into
1adb0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f   the.      ** jo
1adc0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
1add0 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69   is done to avoi
1ade0 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67  d ever modifying
1adf0 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20   a journal.     
1ae00 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20   ** header that 
1ae10 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  is involved in t
1ae20 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70  he rollback of p
1ae30 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
1ae40 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
1ae50 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1ae60 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e  the database (in
1ae70 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72   case the header
1ae80 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61   is.      ** tra
1ae90 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52  shed when the nR
1aea0 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
1aeb0 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ted)..      */. 
1aec0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
1aed0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  c = 0;.      ass
1aee0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1aef0 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20  rnalOff > 0 );. 
1af00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1af10 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
1af20 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
1af30 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1af40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1af50 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1af60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1af70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1af80 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c   pPg = pPager->l
1af90 72 75 2e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a  ru.pFirst;.  }..
1afa0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1afb0 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
1afc0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
1afd0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1afe0 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
1aff0 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ty..  */.  if( p
1b000 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
1b010 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
1b020 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
1b030 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b  nc==0 );.    mak
1b040 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
1b050 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
1b060 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
1b070 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70   = 0;.    rc = p
1b080 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
1b090 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
1b0a0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
1b0b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b0c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1b0d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1b0e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
1b0f0 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a  g->dirty==0 );..
1b100 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
1b110 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e   we are recyclin
1b120 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61  g is marked as a
1b130 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74  lwaysRollback, t
1b140 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65  hen.  ** set the
1b150 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f   global alwaysRo
1b160 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75  llback flag, thu
1b170 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a  s disabling the.
1b180 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
1b190 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1b1a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
1b1b0 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   the rest of thi
1b1c0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
1b1d0 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73   ** It is necess
1b1e0 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62  ary to do this b
1b1f0 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
1b200 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
1b210 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74  lback.  ** might
1b220 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20   be reloaded at 
1b230 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74  a later time but
1b240 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77   at that point w
1b250 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72  e won't remember
1b260 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61  .  ** that is wa
1b270 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
1b280 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
1b290 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
1b2a0 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ges must.  ** be
1b2b0 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
1b2c0 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68  sRollback from h
1b2d0 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f  ere on out..  */
1b2e0 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
1b2f0 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ysRollback ){.  
1b300 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41    IOTRACE(("ALWA
1b310 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e  YS_ROLLBACK %p\n
1b320 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
1b330 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
1b340 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  llback = 1;.  }.
1b350 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  .  /* Unlink the
1b360 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
1b370 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
1b380 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
1b390 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67    */.  unlinkPag
1b3a0 65 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74  e(pPg);.  assert
1b3b0 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29  ( pPg->pgno==0 )
1b3c0 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67  ;..  *ppPg = pPg
1b3d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1b3e0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
1b3f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
1b400 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
1b410 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1b420 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1b430 20 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f 75   free superfluou
1b440 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  s dynamically al
1b450 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a  located memory.*
1b460 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20 70 61  * held by the pa
1b470 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f  ger system. Memo
1b480 72 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e 79  ry in use by any
1b490 20 53 51 4c 69 74 65 20 70 61 67 65 72 20 61 6c   SQLite pager al
1b4a0 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  located.** by th
1b4b0 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
1b4c0 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65 33 5f   may be sqlite3_
1b4d0 66 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20  free()ed..**.** 
1b4e0 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62  nReq is the numb
1b4f0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  er of bytes of m
1b500 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20  emory required. 
1b510 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68  Once this much h
1b520 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61  as.** been relea
1b530 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  sed, the functio
1b540 6e 20 72 65 74 75 72 6e 73 2e 20 54 68 65 20 72  n returns. The r
1b550 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1b560 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1b570 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20  .** of bytes of 
1b580 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e  memory released.
1b590 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1b5a0 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72  agerReleaseMemor
1b5b0 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 69  y(int nReq){.  i
1b5c0 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30  nt nReleased = 0
1b5d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79  ;          /* By
1b5e0 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  tes of memory re
1b5f0 6c 65 61 73 65 64 20 73 6f 20 66 61 72 20 2a 2f  leased so far */
1b600 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b610 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20 2f   *mutex;       /
1b620 2a 20 54 68 65 20 4d 45 4d 32 20 6d 75 74 65 78  * The MEM2 mutex
1b630 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61   */.  Pager *pPa
1b640 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ger;            
1b650 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1b660 20 6f 76 65 72 20 70 61 67 65 72 73 20 2a 2f 0a   over pagers */.
1b670 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 73    BusyHandler *s
1b680 61 76 65 64 42 75 73 79 3b 20 20 20 20 20 2f 2a  avedBusy;     /*
1b690 20 53 61 76 65 64 20 63 6f 70 79 20 6f 66 20 74   Saved copy of t
1b6a0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
1b6b0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1b6c0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 41  LITE_OK;..  /* A
1b6d0 63 71 75 69 72 65 20 74 68 65 20 6d 65 6d 6f 72  cquire the memor
1b6e0 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 6d 75 74  y-management mut
1b6f0 65 78 0a 20 20 2a 2f 0a 20 20 6d 75 74 65 78 20  ex.  */.  mutex 
1b700 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
1b710 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1b720 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b  EX_STATIC_MEM2);
1b730 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b740 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 0a  _enter(mutex);..
1b750 20 20 2f 2a 20 53 69 67 6e 61 6c 20 61 6c 6c 20    /* Signal all 
1b760 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1b770 69 6f 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79  ions that memory
1b780 20 6d 61 6e 61 67 65 6d 65 6e 74 20 77 61 6e 74   management want
1b790 73 0a 20 20 2a 2a 20 74 6f 20 68 61 76 65 20 61  s.  ** to have a
1b7a0 63 63 65 73 73 20 74 6f 20 74 68 65 20 70 61 67  ccess to the pag
1b7b0 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ers..  */.  for(
1b7c0 70 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61  pPager=sqlite3Pa
1b7d0 67 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b  gerList; pPager;
1b7e0 20 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e   pPager=pPager->
1b7f0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61  pNext){.     pPa
1b800 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20  ger->iInUseMM = 
1b810 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  1;.  }..  while(
1b820 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1b830 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65  & (nReq<0 || nRe
1b840 6c 65 61 73 65 64 3c 6e 52 65 71 29 20 29 7b 0a  leased<nReq) ){.
1b850 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
1b860 20 20 20 20 50 67 48 64 72 20 2a 70 52 65 63 79      PgHdr *pRecy
1b870 63 6c 65 64 3b 0a 20 0a 20 20 20 20 2f 2a 20 54  cled;. .    /* T
1b880 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
1b890 65 20 74 6f 20 72 65 63 79 63 6c 65 20 74 68 61  e to recycle tha
1b8a0 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
1b8b0 72 65 20 61 20 73 79 6e 63 28 29 2e 20 49 66 0a  re a sync(). If.
1b8c0 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 6e      ** this is n
1b8d0 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 66 69 6e  ot possible, fin
1b8e0 64 20 6f 6e 65 20 74 68 61 74 20 64 6f 65 73 20  d one that does 
1b8f0 72 65 71 75 69 72 65 20 61 20 73 79 6e 63 28 29  require a sync()
1b900 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
1b910 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1b920 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
1b930 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b940 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
1b950 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
1b960 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69  3LruPageList.pFi
1b970 72 73 74 53 79 6e 63 65 64 3b 0a 20 20 20 20 77  rstSynced;.    w
1b980 68 69 6c 65 28 20 70 50 67 20 26 26 20 28 70 50  hile( pPg && (pP
1b990 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70  g->needSync || p
1b9a0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55  Pg->pPager->iInU
1b9b0 73 65 44 42 29 20 29 7b 0a 20 20 20 20 20 20 70  seDB) ){.      p
1b9c0 50 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e  Pg = pPg->gfree.
1b9d0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
1b9e0 20 69 66 28 20 21 70 50 67 20 29 7b 0a 20 20 20   if( !pPg ){.   
1b9f0 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
1ba00 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72  LruPageList.pFir
1ba10 73 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  st;.      while(
1ba20 20 70 50 67 20 26 26 20 70 50 67 2d 3e 70 50 61   pPg && pPg->pPa
1ba30 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 20 29 7b  ger->iInUseDB ){
1ba40 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 70  .        pPg = p
1ba50 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b  Pg->gfree.pNext;
1ba60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ba70 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1ba80 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d  _leave(sqlite3_m
1ba90 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1baa0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
1bab0 52 55 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  RU));..    /* If
1bac0 20 70 50 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68   pPg==0, then th
1bad0 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 68 61  e block above ha
1bae0 73 20 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64  s failed to find
1baf0 20 61 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a   a page to.    *
1bb00 2a 20 72 65 63 79 63 6c 65 2e 20 49 6e 20 74 68  * recycle. In th
1bb10 69 73 20 63 61 73 65 20 72 65 74 75 72 6e 20 65  is case return e
1bb20 61 72 6c 79 20 2d 20 6e 6f 20 66 75 72 74 68 65  arly - no furthe
1bb30 72 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 0a 20 20  r memory will.  
1bb40 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
1bb50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1bb60 20 21 70 50 67 20 29 20 62 72 65 61 6b 3b 0a 0a   !pPg ) break;..
1bb70 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67      pPager = pPg
1bb80 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 61 73  ->pPager;.    as
1bb90 73 65 72 74 28 21 70 50 67 2d 3e 6e 65 65 64 53  sert(!pPg->needS
1bba0 79 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67  ync || pPg==pPag
1bbb0 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b  er->lru.pFirst);
1bbc0 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 67 2d  .    assert(pPg-
1bbd0 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67  >needSync || pPg
1bbe0 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  ==pPager->lru.pF
1bbf0 69 72 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 0a  irstSynced);.  .
1bc00 20 20 20 20 73 61 76 65 64 42 75 73 79 20 3d 20      savedBusy = 
1bc10 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
1bc20 64 6c 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72  dler;.    pPager
1bc30 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
1bc40 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   0;.    rc = pag
1bc50 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
1bc60 72 2c 20 26 70 52 65 63 79 63 6c 65 64 29 3b 0a  r, &pRecycled);.
1bc70 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
1bc80 79 48 61 6e 64 6c 65 72 20 3d 20 73 61 76 65 64  yHandler = saved
1bc90 42 75 73 79 3b 0a 20 20 20 20 61 73 73 65 72 74  Busy;.    assert
1bca0 28 70 52 65 63 79 63 6c 65 64 3d 3d 70 50 67 20  (pRecycled==pPg 
1bcb0 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
1bcc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1bcd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bce0 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64    /* We've found
1bcf0 20 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e   a page to free.
1bd00 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
1bd10 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
1bd20 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76   .      ** remov
1bd30 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
1bd40 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65   hash-table, fre
1bd50 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65  e-list and synce
1bd60 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 2a 2a  d-list .      **
1bd70 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e   (pFirstSynced).
1bd80 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20   It is still in 
1bd90 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70  the all pages (p
1bda0 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20  All) list. .    
1bdb0 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66    ** Remove it f
1bdc0 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65  rom this list be
1bdd0 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20  fore freeing..  
1bde0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1bdf0 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20  Todo: Check the 
1be00 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74  Pager.pStmt list
1be10 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1be20 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20  is is Ok. It .  
1be30 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
1be40 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20  is though..     
1be50 20 2a 2f 0a 20 20 20 20 20 20 50 67 48 64 72 20   */.      PgHdr 
1be60 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 61 73 73  *pTmp;.      ass
1be70 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ert( pPg );.    
1be80 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65    if( pPg==pPage
1be90 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20  r->pAll ){.     
1bea0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c      pPager->pAll
1beb0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
1bec0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1bed0 20 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70         for( pTmp
1bee0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
1bef0 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70  Tmp->pNextAll!=p
1bf00 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70  Pg; pTmp=pTmp->p
1bf10 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20  NextAll ){}.    
1bf20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41      pTmp->pNextA
1bf30 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  ll = pPg->pNextA
1bf40 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
1bf50 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 28    nReleased += (
1bf60 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f  .          sizeo
1bf70 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72  f(*pPg) + pPager
1bf80 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20  ->pageSize.     
1bf90 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33       + sizeof(u3
1bfa0 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  2) + pPager->nEx
1bfb0 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 2b 20  tra.          + 
1bfc0 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48  MEMDB*sizeof(PgH
1bfd0 69 73 74 6f 72 79 29 20 0a 20 20 20 20 20 20 29  istory) .      )
1bfe0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1bff0 28 22 50 47 46 52 45 45 20 25 70 20 25 64 20 2a  ("PGFREE %p %d *
1c000 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1c010 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
1c020 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1c030 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
1c040 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  count);.      sq
1c050 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 2d 3e  lite3_free(pPg->
1c060 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71  pData);.      sq
1c070 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b  lite3_free(pPg);
1c080 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
1c090 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73  Page--;.    }els
1c0a0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  e{.      /* An e
1c0b0 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
1c0c0 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
1c0d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c0e0 20 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f   or .      ** jo
1c0f0 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72  urnal in pager_r
1c100 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72  ecycle(). The er
1c110 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72  ror is not retur
1c120 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20  ned to the .    
1c130 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74    ** caller of t
1c140 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e  his function. In
1c150 73 74 65 61 64 2c 20 73 65 74 20 74 68 65 20 50  stead, set the P
1c160 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72  ager.errCode var
1c170 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  iable..      ** 
1c180 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
1c190 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
1c1a0 65 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73  e user (or users
1c1b0 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20  , in the case . 
1c1c0 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61       ** of a sha
1c1d0 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29  red pager cache)
1c1e0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f   of the pager fo
1c1f0 72 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f  r which the erro
1c200 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20  r occured..     
1c210 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1c220 28 0a 20 20 20 20 20 20 20 20 20 20 28 72 63 26  (.          (rc&
1c230 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
1c240 45 52 52 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ERR ||.         
1c250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c   rc==SQLITE_FULL
1c260 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63   ||.          rc
1c270 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20  ==SQLITE_BUSY.  
1c280 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
1c290 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1c2a0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1c2b0 45 44 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ED );.      page
1c2c0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1c2d0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
1c2e0 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 6d    /* Clear the m
1c2f0 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
1c300 20 66 6c 61 67 73 20 61 6e 64 20 72 65 6c 65 61   flags and relea
1c310 73 65 20 74 68 65 20 6d 75 74 65 78 0a 20 20 2a  se the mutex.  *
1c320 2f 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73  /.  for(pPager=s
1c330 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b  qlite3PagerList;
1c340 20 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d   pPager; pPager=
1c350 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  pPager->pNext){.
1c360 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e       pPager->iIn
1c370 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 7d 0a 20  UseMM = 0;.  }. 
1c380 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1c390 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 0a 20 20  eave(mutex);..  
1c3a0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  /* Return the nu
1c3b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
1c3c0 6c 65 61 73 65 64 0a 20 20 2a 2f 0a 20 20 72 65  leased.  */.  re
1c3d0 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a  turn nReleased;.
1c3e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1c3f0 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
1c400 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a  _MANAGEMENT */..
1c410 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
1c420 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70  ontent of page p
1c430 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1c440 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
1c450 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
1c460 62 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  bPage(Pager *pPa
1c470 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c  ger, PgHdr *pPg,
1c480 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
1c490 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66 66  nt rc;.  i64 off
1c4a0 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  set;.  assert( M
1c4b0 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73  EMDB==0 );.  ass
1c4c0 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
1c4d0 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
1c4e0 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ->tempFile);.  i
1c4f0 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e  f( !pPager->fd->
1c500 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1c510 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1c520 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
1c530 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 28    }.  offset = (
1c540 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1c550 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1c560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1c570 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
1c580 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1c590 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
1c5a0 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  Size, offset);. 
1c5b0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1c5c0 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
1c5d0 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
1c5e0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
1c5f0 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
1c600 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
1c610 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1c620 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
1c630 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  {.    memcpy(&pP
1c640 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1c650 2c 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f 54  , &((u8*)PGHDR_T
1c660 4f 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34 5d  O_DATA(pPg))[24]
1c670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6a0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1c6b0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d  bFileVers));.  }
1c6c0 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1c6d0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1c6e0 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  pPg), pPg->pgno,
1c6f0 20 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43   3);.  PAGERTRAC
1c700 45 34 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E4("FETCH %d pag
1c710 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
1c720 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1c730 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1c740 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1c750 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1c760 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  g));.  return rc
1c770 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1c780 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1c790 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  led to obtain th
1c7a0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65  e shared lock re
1c7b0 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a  quired before.**
1c7c0 20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61   data may be rea
1c7d0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
1c7e0 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73   cache. If the s
1c7f0 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61  hared lock has a
1c800 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f  lready.** been o
1c810 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75  btained, this fu
1c820 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1c830 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61  p..**.** Immedia
1c840 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
1c850 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ning the shared 
1c860 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65  lock (if require
1c870 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  d), this functio
1c880 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20  n.** checks for 
1c890 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
1c8a0 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f  le. If one is fo
1c8b0 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63  und, an emergenc
1c8c0 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73  y rollback.** is
1c8d0 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64   performed immed
1c8e0 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  iately..*/.stati
1c8f0 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65  c int pagerShare
1c900 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
1c910 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
1c920 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
1c930 74 20 69 73 48 6f 74 20 3d 20 30 3b 0a 0a 20 20  t isHot = 0;..  
1c940 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
1c950 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f  ase is opened fo
1c960 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  r exclusive acce
1c970 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  ss, has no outst
1c980 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67  anding .  ** pag
1c990 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  e references and
1c9a0 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d   is in an error-
1c9b0 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 74 68  state, now is th
1c9c0 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61  e chance to clea
1c9d0 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72  r.  ** the error
1c9e0 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f  . Discard the co
1c9f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
1ca00 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72  ger-cache and tr
1ca10 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65  eat any.  ** ope
1ca20 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  n journal file a
1ca30 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e  s a hot-journal.
1ca40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d  .  */.  if( !MEM
1ca50 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78  DB && pPager->ex
1ca60 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
1ca70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
1ca80 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
1ca90 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  e ){.    if( pPa
1caa0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1cab0 20 29 7b 0a 20 20 20 20 20 20 69 73 48 6f 74 20   ){.      isHot 
1cac0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
1cad0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1cae0 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
1caf0 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
1cb00 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  _OK;.  }..  /* I
1cb10 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73  f the pager is s
1cb20 74 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72  till in an error
1cb30 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70   state, do not p
1cb40 72 6f 63 65 65 64 2e 20 54 68 65 20 65 72 72 6f  roceed. The erro
1cb50 72 20 0a 20 20 2a 2a 20 73 74 61 74 65 20 77 69  r .  ** state wi
1cb60 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 61 74  ll be cleared at
1cb70 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
1cb80 68 65 20 66 75 74 75 72 65 20 77 68 65 6e 20 61  he future when a
1cb90 6c 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20 72 65  ll page .  ** re
1cba0 66 65 72 65 6e 63 65 73 20 61 72 65 20 64 72 6f  ferences are dro
1cbb0 70 70 65 64 20 61 6e 64 20 74 68 65 20 63 61 63  pped and the cac
1cbc0 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72  he can be discar
1cbd0 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ded..  */.  if( 
1cbe0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1cbf0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
1cc00 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
1cc10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
1cc20 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1cc30 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
1cc40 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
1cc50 4e 4c 4f 43 4b 20 7c 7c 20 69 73 48 6f 74 20 29  NLOCK || isHot )
1cc60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
1cc70 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1cc80 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 66 28 20  ->pVfs;.    if( 
1cc90 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
1cca0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ccb0 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20  nRef==0 );.     
1ccc0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
1ccd0 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  Readlock ){.    
1cce0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1ccf0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
1cd00 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
1cd10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1cd20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1cd30 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1cd40 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1cd50 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
1cd60 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1cd70 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1cd80 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
1cd90 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
1cda0 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
1cdb0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
1cdc0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
1cdd0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
1cde0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
1cdf0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
1ce00 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
1ce10 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
1ce20 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
1ce30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
1ce40 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
1ce50 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1ce60 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
1ce70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ce80 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1ce90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1cea0 20 72 63 3d 3d 31 20 7c 7c 20 69 73 48 6f 74 20   rc==1 || isHot 
1ceb0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ){.        /* Ge
1cec0 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
1ced0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1cee0 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
1cef0 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
1cf00 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
1cf10 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
1cf20 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
1cf30 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
1cf40 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
1cf50 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1cf60 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
1cf70 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
1cf80 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
1cf90 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62          ** datab
1cfa0 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
1cfb0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
1cfc0 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
1cfd0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
1cfe0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
1cff0 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
1d000 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
1d010 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
1d020 67 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  g it .        **
1d030 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   back..        *
1d040 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65  * .        ** Be
1d050 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
1d060 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
1d070 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
1d080 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20  ested, the.     
1d090 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f     ** second pro
1d0a0 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f  cess will get to
1d0b0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
1d0c0 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
1d0d0 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f   to.        ** o
1d0e0 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
1d0f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1d100 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d110 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
1d120 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1d130 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56  ->state<EXCLUSIV
1d140 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
1d150 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d160 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
1d170 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
1d180 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  K);.          if
1d190 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d1a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1d1b0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
1d1c0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
1d1d0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1d1e0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1d1f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d200 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
1d210 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
1d220 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 20 20  LUSIVE;.        
1d230 7d 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f  }. .        /* O
1d240 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
1d250 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
1d260 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62  ccess. This is b
1d270 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
1d280 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d     ** exclusive-
1d290 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
1d2a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1d2b0 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
1d2c0 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
1d2d0 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
1d2e0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
1d2f0 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
1d300 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
1d310 20 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75          ** OsTru
1d320 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
1d330 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
1d340 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
1d350 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20  requires.       
1d360 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65   ** a read/write
1d370 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20   file handle..  
1d380 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1d390 20 69 66 28 20 21 69 73 48 6f 74 20 26 26 20 70   if( !isHot && p
1d3a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1d3b0 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
1d3c0 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 71 6c     int res = sql
1d3d0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
1d3e0 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s,pPager->zJourn
1d3f0 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53 53  al,SQLITE_ACCESS
1d400 5f 45 58 49 53 54 53 29 3b 0a 20 20 20 20 20 20  _EXISTS);.      
1d410 20 20 20 20 69 66 28 20 72 65 73 3d 3d 31 20 29      if( res==1 )
1d420 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
1d430 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
1d440 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
1d450 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1d460 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
1d470 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
1d480 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1d490 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
1d4a0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
1d4b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d4c0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
1d4d0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1d4e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
1d4f0 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
1d500 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
1d510 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1d520 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f  ger->jfd->pMetho
1d530 64 73 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ds );.          
1d540 20 20 69 66 28 20 66 6f 75 74 26 53 51 4c 49 54    if( fout&SQLIT
1d550 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
1d560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1d570 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1d580 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y;.             
1d590 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
1d5a0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
1d5b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d5c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d5d0 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
1d5e0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1d5f0 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
1d600 20 65 78 69 73 74 2c 20 74 68 61 74 20 6d 65 61   exist, that mea
1d610 6e 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ns some other pr
1d620 6f 63 65 73 73 0a 20 20 20 20 20 20 20 20 20 20  ocess.          
1d630 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
1d640 20 72 6f 6c 6c 65 64 20 69 74 20 62 61 63 6b 20   rolled it back 
1d650 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
1d660 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1d670 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1d680 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1d690 20 49 66 20 73 71 6c 69 74 65 33 4f 73 41 63 63   If sqlite3OsAcc
1d6a0 65 73 73 28 29 20 72 65 74 75 72 6e 73 20 61 20  ess() returns a 
1d6b0 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 2c 20  negative value, 
1d6c0 74 68 61 74 20 6d 65 61 6e 73 20 69 74 0a 20 20  that means it.  
1d6d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69            ** fai
1d6e0 6c 65 64 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c  led a memory all
1d6f0 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ocation */.     
1d700 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1d710 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1d720 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d730 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1d740 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
1d760 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
1d770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 77 69  );.          swi
1d780 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 20  tch( rc ){.     
1d790 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1d7a0 54 45 5f 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20  TE_NOMEM:.      
1d7b0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1d7c0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 0a  E_IOERR_UNLOCK:.
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
1d7e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1d7f0 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20  MEM:.           
1d800 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d810 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
1d820 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t:.             
1d830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
1d840 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  USY;.          }
1d850 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d860 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1d870 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  alOpen = 1;.    
1d880 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1d890 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
1d8a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1d8b0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1d8c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1d8d0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
1d8e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1d8f0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
1d900 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  .        /* Play
1d910 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
1d920 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
1d930 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
1d940 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  write.        **
1d950 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
1d960 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
1d970 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  k..        */.  
1d980 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1d990 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
1d9a0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
1d9b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d9c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1d9d0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
1d9e0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
1d9f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1da00 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74  ssert(pPager->st
1da10 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
1da20 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  D || .          
1da30 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75    (pPager->exclu
1da40 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
1da50 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
1da60 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 20  SHARED).        
1da70 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1da80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
1da90 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ll ){.        /*
1daa0 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
1dab0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
1dac0 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
1dad0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
1dae0 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
1daf0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
1db00 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
1db10 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
1db20 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61  s.        ** rea
1db30 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
1db40 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
1db50 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
1db60 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a  tabase.        *
1db70 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
1db80 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
1db90 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
1dba0 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
1dbb0 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20       ** cache.. 
1dbc0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1dbd0 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
1dbe0 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
1dbf0 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
1dc00 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
1dc10 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74  ng.        ** at
1dc20 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
1dc30 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
1dc40 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
1dc50 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
1dc60 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
1dc70 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
1dc80 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
1dc90 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
1dca0 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  The.        ** o
1dcb0 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
1dcc0 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
1dcd0 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
1dce0 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
1dcf0 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
1dd00 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a  se..        ** .
1dd10 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65          ** There
1dd20 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
1dd30 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
1dd40 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
1dd50 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
1dd60 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
1dd70 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
1dd80 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
1dd90 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
1dda0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hat.        ** i
1ddb0 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
1ddc0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
1ddd0 20 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69         char dbFi
1dde0 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
1ddf0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1de00 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  )];.        sqli
1de10 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1de20 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  t(pPager);..    
1de30 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1de40 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
1de50 20 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67       return pPag
1de60 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
1de70 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1de80 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1de90 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
1dea0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
1deb0 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
1dec0 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
1ded0 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
1dee0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1def0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1df00 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
1df10 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
1df20 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
1df30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1df40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1df50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1df60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1df70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1df80 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
1df90 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
1dfa0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
1dfb0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1dfc0 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50     if( memcmp(pP
1dfd0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1dfe0 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
1dff0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
1e000 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1e010 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1e020 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ager);.        }
1e030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e040 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1e050 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
1e060 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
1e070 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e<=PAGER_SHARED 
1e080 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1e090 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1e0a0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
1e0b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1e0c0 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
1e0d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1e0e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1e0f0 6c 6c 6f 63 61 74 65 20 61 20 50 67 48 64 72 20  llocate a PgHdr 
1e100 6f 62 6a 65 63 74 2e 20 20 20 45 69 74 68 65 72  object.   Either
1e110 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
1e120 65 20 6f 72 20 72 65 75 73 65 0a 2a 2a 20 61 6e  e or reuse.** an
1e130 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 74 68   existing one th
1e140 61 74 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77  at is not otherw
1e150 69 73 65 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  ise in use..**.*
1e160 2a 20 41 20 6e 65 77 20 50 67 48 64 72 20 73 74  * A new PgHdr st
1e170 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
1e180 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ed if any of the
1e190 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 0a 2a   following are.*
1e1a0 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  * true:.**.**   
1e1b0 20 20 28 31 29 20 20 57 65 20 68 61 76 65 20 6e    (1)  We have n
1e1c0 6f 74 20 65 78 63 65 65 64 65 64 20 6f 75 72 20  ot exceeded our 
1e1d0 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 65  maximum allocate
1e1e0 64 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20  d cache size.** 
1e1f0 20 20 20 20 20 20 20 20 20 61 73 20 73 65 74 20           as set 
1e200 62 79 20 74 68 65 20 22 50 52 41 47 4d 41 20 63  by the "PRAGMA c
1e210 61 63 68 65 5f 73 69 7a 65 22 20 63 6f 6d 6d 61  ache_size" comma
1e220 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32  nd..**.**     (2
1e230 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  )  There are no 
1e240 75 6e 75 73 65 64 20 50 67 48 64 72 20 6f 62 6a  unused PgHdr obj
1e250 65 63 74 73 20 61 76 61 69 6c 61 62 6c 65 20 61  ects available a
1e260 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a  t this time..**.
1e270 2a 2a 20 20 20 20 20 28 33 29 20 20 54 68 69 73  **     (3)  This
1e280 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
1e290 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1e2a0 20 20 20 20 20 28 34 29 20 20 54 68 65 72 65 20       (4)  There 
1e2b0 61 72 65 20 6e 6f 20 50 67 48 64 72 20 6f 62 6a  are no PgHdr obj
1e2c0 65 63 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ects that do not
1e2d0 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
1e2e0 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  al.**          f
1e2f0 69 6c 65 20 73 79 6e 63 20 61 6e 64 20 61 20 73  ile sync and a s
1e300 79 6e 63 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ync of the journ
1e310 61 6c 20 66 69 6c 65 20 69 73 20 63 75 72 72 65  al file is curre
1e320 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  ntly.**         
1e330 20 70 72 6f 68 69 62 69 74 65 64 2e 0a 2a 2a 0a   prohibited..**.
1e340 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
1e350 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  use an existing 
1e360 50 67 48 64 72 2e 20 20 49 6e 20 6f 74 68 65 72  PgHdr.  In other
1e370 20 77 6f 72 64 73 2c 20 72 65 75 73 65 20 61 6e   words, reuse an
1e380 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 50 67 48  .** existing PgH
1e390 64 72 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  dr if all of the
1e3a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1e3b0 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  rue:.**.**     (
1e3c0 31 29 20 20 57 65 20 68 61 76 65 20 72 65 61 63  1)  We have reac
1e3d0 68 65 64 20 6f 72 20 65 78 63 65 65 64 65 64 20  hed or exceeded 
1e3e0 74 68 65 20 6d 61 78 69 6d 75 6d 20 63 61 63 68  the maximum cach
1e3f0 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  e size.**       
1e400 20 20 20 61 6c 6c 6f 77 65 64 20 62 79 20 22 50     allowed by "P
1e410 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
1e420 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29  "..**.**     (2)
1e430 20 20 54 68 65 72 65 20 69 73 20 61 20 50 67 48    There is a PgH
1e440 64 72 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74  dr available wit
1e450 68 20 50 67 48 64 72 2d 3e 6e 52 65 66 3d 3d 30  h PgHdr->nRef==0
1e460 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  .**.**     (3)  
1e470 57 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 61 6e  We are not in an
1e480 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1e490 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34  ase.**.**     (4
1e4a0 29 20 20 45 69 74 68 65 72 20 74 68 65 72 65 20  )  Either there 
1e4b0 69 73 20 61 6e 20 61 76 61 69 6c 61 62 6c 65 20  is an available 
1e4c0 50 67 48 64 72 20 74 68 61 74 20 64 6f 65 73 20  PgHdr that does 
1e4d0 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20  not need.**     
1e4e0 20 20 20 20 20 74 6f 20 62 65 20 73 79 6e 63 65       to be synce
1e4f0 64 20 74 6f 20 64 69 73 6b 20 6f 72 20 65 6c 73  d to disk or els
1e500 65 20 64 69 73 6b 20 73 79 6e 63 69 6e 67 20 69  e disk syncing i
1e510 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  s currently.**  
1e520 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 2e          allowed.
1e530 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1e540 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65  agerAllocatePage
1e550 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1e560 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20  PgHdr **ppPg){. 
1e570 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e580 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  _OK;.  PgHdr *pP
1e590 67 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 48 64  g;.  int nByteHd
1e5a0 72 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  r;..  /* Create 
1e5b0 61 20 6e 65 77 20 50 67 48 64 72 20 69 66 20 61  a new PgHdr if a
1e5c0 6e 79 20 6f 66 20 74 68 65 20 66 6f 75 72 20 63  ny of the four c
1e5d0 6f 6e 64 69 74 69 6f 6e 73 20 64 65 66 69 6e 65  onditions define
1e5e0 64 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20 61 72  d .  ** above ar
1e5f0 65 20 6d 65 74 3a 20 2a 2f 0a 20 20 69 66 28 20  e met: */.  if( 
1e600 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
1e610 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a 20 20 20  ager->mxPage.   
1e620 7c 7c 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  || pPager->lru.p
1e630 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c 7c 20  First==0 .   || 
1e640 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70 50 61  MEMDB.   || (pPa
1e650 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
1e660 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67  ynced==0 && pPag
1e670 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20  er->doNotSync). 
1e680 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   ){.    void *pD
1e690 61 74 61 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ata;.    if( pPa
1e6a0 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67  ger->nPage>=pPag
1e6b0 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20  er->nHash ){.   
1e6c0 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f     pager_resize_
1e6d0 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65  hash_table(pPage
1e6e0 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  r,.         pPag
1e6f0 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20  er->nHash<256 ? 
1e700 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48  256 : pPager->nH
1e710 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66  ash*2);.      if
1e720 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d  ( pPager->nHash=
1e730 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1e740 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1e750 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
1e760 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
1e770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e780 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
1e790 50 61 67 65 72 29 3b 0a 20 20 20 20 6e 42 79 74  Pager);.    nByt
1e7a0 65 48 64 72 20 3d 20 73 69 7a 65 6f 66 28 2a 70  eHdr = sizeof(*p
1e7b0 50 67 29 20 2b 20 73 69 7a 65 6f 66 28 75 33 32  Pg) + sizeof(u32
1e7c0 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
1e7d0 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ra.             
1e7e0 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28   + MEMDB*sizeof(
1e7f0 50 67 48 69 73 74 6f 72 79 29 3b 0a 20 20 20 20  PgHistory);.    
1e800 70 50 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  pPg = sqlite3_ma
1e810 6c 6c 6f 63 28 20 6e 42 79 74 65 48 64 72 20 29  lloc( nByteHdr )
1e820 3b 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b  ;.    if( pPg ){
1e830 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 73  .      pData = s
1e840 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70  qlite3_malloc( p
1e850 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1e860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  );.      if( pDa
1e870 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ta==0 ){.       
1e880 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
1e890 67 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67 20  g);.        pPg 
1e8a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1e8b0 20 7d 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65   }.    pagerEnte
1e8c0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  r(pPager);.    i
1e8d0 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
1e8e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1e8f0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
1e900 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
1e910 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
1e920 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 6e 42  emset(pPg, 0, nB
1e930 79 74 65 48 64 72 29 3b 0a 20 20 20 20 70 50 67  yteHdr);.    pPg
1e940 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b  ->pData = pData;
1e950 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
1e960 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 70   = pPager;.    p
1e970 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  Pg->pNextAll = p
1e980 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20  Pager->pAll;.   
1e990 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
1e9a0 70 50 67 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  pPg;.    pPager-
1e9b0 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 7d 65 6c 73  >nPage++;.  }els
1e9c0 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63 79 63 6c  e{.    /* Recycl
1e9d0 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61  e an existing pa
1e9e0 67 65 20 77 69 74 68 20 61 20 7a 65 72 6f 20 72  ge with a zero r
1e9f0 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20  ef-count. */.   
1ea00 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79   rc = pager_recy
1ea10 63 6c 65 28 70 50 61 67 65 72 2c 20 26 70 50 67  cle(pPager, &pPg
1ea20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1ea30 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
1ea40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ea50 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20  IOERR_BLOCKED;. 
1ea60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1ea70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ea80 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
1ea90 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
1eaa0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1eab0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48  Pager->state>=SH
1eac0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
1ead0 20 61 73 73 65 72 74 28 70 50 67 29 3b 0a 20 20   assert(pPg);.  
1eae0 7d 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b  }.  *ppPg = pPg;
1eaf0 0a 0a 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  ..pager_allocate
1eb00 5f 6f 75 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  _out:.  return r
1eb10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
1eb20 20 73 75 72 65 20 77 65 20 68 61 76 65 20 74 68   sure we have th
1eb30 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20  e content for a 
1eb40 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61  page.  If the pa
1eb50 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f  ge was.** previo
1eb60 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69  usly acquired wi
1eb70 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c  th noContent==1,
1eb80 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
1eb90 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e  t was.** just in
1eba0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
1ebb0 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65  os instead of be
1ebc0 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ing read from di
1ebd0 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77  sk..** But now w
1ebe0 65 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20  e need the real 
1ebf0 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b  data off of disk
1ec00 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  .  So make sure 
1ec10 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20  we.** have it.  
1ec20 52 65 61 64 20 69 74 20 69 6e 20 69 66 20 77 65  Read it in if we
1ec30 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20   do not have it 
1ec40 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74  already..*/.stat
1ec50 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74  ic int pager_get
1ec60 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a  _content(PgHdr *
1ec70 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
1ec80 3e 6e 65 65 64 52 65 61 64 20 29 7b 0a 20 20 20  >needRead ){.   
1ec90 20 69 6e 74 20 72 63 20 3d 20 72 65 61 64 44 62   int rc = readDb
1eca0 50 61 67 65 28 70 50 67 2d 3e 70 50 61 67 65 72  Page(pPg->pPager
1ecb0 2c 20 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f  , pPg, pPg->pgno
1ecc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1ecd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ece0 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20    pPg->needRead 
1ecf0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1ed00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ed10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ed20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1ed30 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
1ed40 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  a page..**.** A 
1ed50 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1ed60 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62   disk file is ob
1ed70 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20  tained when the 
1ed80 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63  first page is ac
1ed90 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73  quired. .** This
1eda0 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72   read lock is dr
1edb0 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c  opped when the l
1edc0 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
1edd0 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ased..**.** This
1ede0 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66   routine works f
1edf0 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
1ee00 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
1ee10 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
1ee20 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
1ee30 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
1ee40 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
1ee50 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
1ee60 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
1ee70 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
1ee80 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
1ee90 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
1eea0 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
1eeb0 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
1eec0 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
1eed0 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
1eee0 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
1eef0 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
1ef00 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
1ef10 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
1ef20 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
1ef30 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
1ef40 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
1ef50 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
1ef60 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
1ef70 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
1ef80 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1ef90 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
1efa0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
1efb0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
1efc0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
1efd0 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
1efe0 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
1eff0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
1f000 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
1f010 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
1f020 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
1f030 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1f040 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
1f050 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
1f060 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
1f070 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
1f080 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
1f090 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
1f0a0 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
1f0b0 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
1f0c0 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
1f0d0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
1f0e0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
1f0f0 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
1f100 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
1f110 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
1f120 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
1f130 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
1f140 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
1f150 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
1f160 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
1f170 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
1f180 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
1f190 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70   is false, the p
1f1a0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
1f1b0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
1f1c0 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20  rom disk..** If 
1f1d0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
1f1e0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
1f1f0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
1f200 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
1f210 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
1f220 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  e at this time, 
1f230 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64  so do not do a d
1f240 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20  isk read.  Just 
1f250 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70  fill in the.** p
1f260 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  age content with
1f270 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72   zeros.  But mar
1f280 6b 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  k the fact that 
1f290 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64  we have not read
1f2a0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
1f2b0 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  by setting the P
1f2c0 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
1f2d0 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69  ag.  Later on, i
1f2e0 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  f .** sqlite3Pag
1f2f0 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
1f300 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65  led on this page
1f310 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
1f320 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ine is.** called
1f330 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f   again with noCo
1f340 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d  ntent==0, that m
1f350 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f  eans that the co
1f360 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a  ntent is needed.
1f370 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20  ** and the disk 
1f380 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
1f390 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
1f3a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f3b0 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
1f3c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
1f3d0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1f3e0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
1f3f0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
1f400 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
1f410 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
1f420 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
1f430 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
1f440 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
1f450 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
1f460 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
1f470 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
1f480 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
1f490 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e  r reading conten
1f4a0 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74  t from disk if t
1f4b0 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64  rue */.){.  PgHd
1f4c0 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
1f4d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1f4e0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1f4f0 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  R_UNLOCK || pPag
1f500 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67  er->nRef>0 || pg
1f510 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  no==1 );..  /* T
1f520 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
1f530 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
1f540 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
1f550 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
1f560 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
1f570 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
1f580 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
1f590 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
1f5a0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
1f5b0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
1f5c0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
1f5d0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
1f5e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1f5f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1f600 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
1f610 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
1f620 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
1f630 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
1f640 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f650 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
1f660 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  e = 0;..  /* If 
1f670 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1f680 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c  t page accessed,
1f690 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52   then get a SHAR
1f6a0 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ED lock.  ** on 
1f6b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f6c0 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  e. pagerSharedLo
1f6d0 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
1f6e0 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62  if .  ** a datab
1f6f0 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ase lock is alre
1f700 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20  ady held..  */. 
1f710 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65   rc = pagerShare
1f720 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  dLock(pPager);. 
1f730 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f740 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1f750 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1f760 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1f770 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1f780 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  ;..  pPg = pager
1f790 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
1f7a0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
1f7b0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1f7c0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
1f7d0 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70   is not in the p
1f7e0 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
1f7f0 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20    int nMax;.    
1f800 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47 45 52  int h;.    PAGER
1f810 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
1f820 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  iss);.    rc = p
1f830 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65  agerAllocatePage
1f840 28 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a  (pPager, &pPg);.
1f850 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f860 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1f870 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1f880 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  .    pPg->pgno =
1f890 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72   pgno;.    asser
1f8a0 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67 6e  t( !MEMDB || pgn
1f8b0 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  o>pPager->stmtSi
1f8c0 7a 65 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69  ze );.    pPg->i
1f8d0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
1f8e0 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
1f8f0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
1f900 20 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d   pgno);.    pPg-
1f910 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a  >needSync = 0;..
1f920 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
1f930 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65  g);.    pPg->nRe
1f940 66 20 3d 20 31 3b 0a 0a 20 20 20 20 70 50 61 67  f = 1;..    pPag
1f950 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
1f960 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  if( pPager->nExt
1f970 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ra>0 ){.      me
1f980 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
1f990 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
1f9a0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
1f9b0 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
1f9c0 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 50 61  nMax = sqlite3Pa
1f9d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1f9e0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ger);.    if( pP
1f9f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1fa00 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67  .      rc = pPag
1fa10 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
1fa20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1fa30 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
1fa40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fa50 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  }..    /* Popula
1fa60 74 65 20 74 68 65 20 70 61 67 65 20 77 69 74 68  te the page with
1fa70 20 64 61 74 61 2c 20 65 69 74 68 65 72 20 62 79   data, either by
1fa80 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
1fa90 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
1faa0 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79 20 73 65  * file, or by se
1fab0 74 74 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65  tting the entire
1fac0 20 70 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20   page to zero.. 
1fad0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d     */.    if( nM
1fae0 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  ax<(int)pgno || 
1faf0 4d 45 4d 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74  MEMDB || (noCont
1fb00 65 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ent && !pPager->
1fb10 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20  alwaysRollback) 
1fb20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
1fb30 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
1fb40 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1fb50 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1fb60 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
1fb70 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
1fb80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
1fb90 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
1fba0 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
1fbb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1fbc0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65       pPg->needRe
1fbd0 61 64 20 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26  ad = noContent &
1fbe0 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  & !pPager->alway
1fbf0 73 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20  sRollback;.     
1fc00 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
1fc10 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1fc20 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
1fc30 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1fc40 72 65 61 64 44 62 50 61 67 65 28 70 50 61 67 65  readDbPage(pPage
1fc50 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20  r, pPg, pgno);. 
1fc60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1fc70 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
1fc80 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1fc90 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
1fca0 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a   pPg->pgno = 0;.
1fcb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1fcc0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
1fcd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1fce0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1fcf0 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
1fd00 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
1fd10 2a 20 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20  * Link the page 
1fd20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 68 61  into the page ha
1fd30 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  sh table */.    
1fd40 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
1fd50 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
1fd60 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
1fd70 30 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  0 );.    pPg->pN
1fd80 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
1fd90 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20  ->aHash[h];.    
1fda0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
1fdb0 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
1fdc0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
1fdd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1fde0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
1fdf0 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
1fe00 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
1fe10 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
1fe20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69  = pPg;.    }..#i
1fe30 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1fe40 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
1fe50 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
1fe60 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
1fe70 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
1fe80 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
1fe90 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
1fea0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
1feb0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70   */.    assert(p
1fec0 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c  Pager->nRef>0 ||
1fed0 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50   pgno==1);.    P
1fee0 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
1fef0 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 69 66 28  ->nHit);.    if(
1ff00 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
1ff10 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1ff20 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
1ff30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1ff40 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1ff50 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1ff60 20 7d 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28   }.    page_ref(
1ff70 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
1ff80 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  age = pPg;.  ret
1ff90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1ffa0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1ffb0 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
1ffc0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
1ffd0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
1ffe0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
1fff0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
20000 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
20010 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
20020 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
20030 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
20040 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
20050 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
20060 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  here */.  int no
20070 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a  Content       /*
20080 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72   Do not bother r
20090 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66  eading content f
200a0 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65  rom disk if true
200b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
200c0 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
200d0 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
200e0 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
200f0 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  r, pgno, ppPage,
20100 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70   noContent);.  p
20110 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
20120 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20130 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  }.../*.** Acquir
20140 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
20150 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
20160 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
20170 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
20180 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
20190 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
201a0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
201b0 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
201c0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
201d0 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
201e0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
201f0 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
20200 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
20210 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
20220 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
20230 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
20240 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
20250 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
20260 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
20270 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
20280 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
20290 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
202a0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
202b0 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
202c0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
202d0 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
202e0 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
202f0 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
20300 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
20310 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
20320 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
20330 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
20340 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 0a 20 20  dr *pPg = 0;..  
20350 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
20360 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
20370 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 70 61 67  gno!=0 );..  pag
20380 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
20390 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
203a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
203b0 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
203c0 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  ( !pPager->pAll 
203d0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  || pPager->exclu
203e0 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 7d 65  siveMode );.  }e
203f0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
20400 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
20410 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
20420 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 2f  TE_FULL ){.    /
20430 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
20440 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 67    }else if( (pPg
20450 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
20460 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 21 3d  pPager, pgno))!=
20470 30 20 29 7b 0a 20 20 20 20 70 61 67 65 5f 72 65  0 ){.    page_re
20480 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61  f(pPg);.  }.  pa
20490 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
204a0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a  ;.  return pPg;.
204b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
204c0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
204d0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
204e0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
204f0 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
20500 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
20510 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
20520 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
20530 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
20540 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
20550 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
20560 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
20570 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
20580 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
20590 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
205a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
205b0 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
205c0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
205d0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
205e0 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 44 65 63  Pager;..  /* Dec
205f0 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
20600 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74  ence count for t
20610 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  his page.  */.  
20620 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
20630 66 3e 30 20 29 3b 0a 20 20 70 61 67 65 72 45 6e  f>0 );.  pagerEn
20640 74 65 72 28 70 50 67 2d 3e 70 50 61 67 65 72 29  ter(pPg->pPager)
20650 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pPg->nRef--;
20660 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
20670 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  Pg);..  /* When 
20680 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
20690 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61  ferences to a pa
206a0 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c  ge reach 0, call
206b0 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75   the.  ** destru
206c0 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65  ctor and add the
206d0 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
206e0 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elist..  */.  if
206f0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
20700 7b 0a 0a 20 20 20 20 6c 72 75 4c 69 73 74 41 64  {..    lruListAd
20710 64 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  d(pPg);.    if( 
20720 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
20730 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  tor ){.      pPa
20740 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
20750 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  (pPg, pPager->pa
20760 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
20770 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c   .    /* When al
20780 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68  l pages reach th
20790 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70  e freelist, drop
207a0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66   the read lock f
207b0 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  rom.    ** the d
207c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
207d0 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
207e0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73  >nRef--;.    ass
207f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
20800 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  f>=0 );.    if( 
20810 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
20820 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63  && (!pPager->exc
20830 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
20840 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20850 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  >0) ){.      pag
20860 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
20870 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
20880 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65   }.  }.  pagerLe
20890 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
208a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
208b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
208c0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
208d0 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65  for pPager.  The
208e0 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  re should alread
208f0 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a  y be a RESERVED.
20900 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ** or EXCLUSIVE 
20910 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
20920 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74  base file when t
20930 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
20940 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
20950 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
20960 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65   everything.  Re
20970 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
20980 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  de and release t
20990 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b  he.** write lock
209a0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
209b0 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
209c0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
209d0 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
209e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
209f0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
20a00 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
20a10 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
20a20 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
20a30 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45  TE|SQLITE_OPEN_E
20a40 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f  XCLUSIVE|SQLITE_
20a50 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 0a 20  OPEN_CREATE);.. 
20a60 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
20a70 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  t( !MEMDB );.  a
20a80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
20a90 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
20aa0 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  RVED );.  assert
20ab0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
20ac0 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
20ad0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
20ae0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  rnal==0 );.  sql
20af0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
20b00 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  nt(pPager);.  pa
20b10 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
20b20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
20b30 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
20b40 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
20b50 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
20b60 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
20b70 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
20b80 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
20b90 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
20ba0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
20bb0 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
20bc0 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a  n_journal;.  }..
20bd0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
20be0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a  urnalOpen==0 ){.
20bf0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
20c00 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
20c10 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49    flags |= (SQLI
20c20 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
20c30 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CLOSE|SQLITE_OPE
20c40 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b  N_TEMP_JOURNAL);
20c50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20c60 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49    flags |= (SQLI
20c70 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
20c80 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 23 69 66  RNAL);.    }.#if
20c90 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
20ca0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
20cb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
20cc0 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
20cd0 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
20ce0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
20cf0 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
20d00 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
20d10 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 23 65  Pager).    );.#e
20d20 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  lse.    rc = sql
20d30 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
20d40 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
20d50 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
20d60 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69  flags, 0);.#endi
20d70 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  f.    assert( rc
20d80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
20d90 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
20da0 68 6f 64 73 20 29 3b 0a 20 20 20 20 70 50 61 67  hods );.    pPag
20db0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
20dc0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
20dd0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
20de0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
20df0 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 69  alHdr = 0;.    i
20e00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20e10 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
20e20 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
20e30 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
20e40 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
20e50 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
20e60 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
20e70 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
20e80 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
20e90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61  .    }.  }.  pPa
20ea0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
20eb0 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 1;.  pPager->
20ec0 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
20ed0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
20ee0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
20ef0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
20f00 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67  back = 0;.  pPag
20f10 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
20f20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
20f30 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ode ){.    rc = 
20f40 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
20f50 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
20f60 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
20f70 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
20f80 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
20f90 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
20fa0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
20fb0 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20  lHdr(pPager);.. 
20fc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
20fd0 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d  tAutoopen && rc=
20fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20ff0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21000 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61  gerStmtBegin(pPa
21010 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
21020 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
21030 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
21040 4d 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  M && rc!=SQLITE_
21050 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  IOERR_NOMEM ){. 
21060 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
21070 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
21080 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
21090 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
210a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
210b0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
210c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  }.  return rc;..
210d0 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
210e0 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65  ournal:.  sqlite
210f0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
21100 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
21110 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
21120 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
21130 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21140 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72  .** Acquire a wr
21150 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
21160 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c  database.  The l
21170 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77  ock is removed w
21180 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f  hen.** the any o
21190 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
211a0 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  happen:.**.**   
211b0 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  *  sqlite3PagerC
211c0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
211d0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
211e0 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  *  sqlite3PagerR
211f0 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c  ollback() is cal
21200 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
21210 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
21220 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
21230 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
21240 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  Unref() is calle
21250 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
21260 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
21270 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
21280 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
21290 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70  s routine is a p
212a0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70  ointer to any op
212b0 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  en page of the.*
212c0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
212d0 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65    Nothing change
212e0 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65  s about the page
212f0 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65   - it is used me
21300 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69  rely to.** acqui
21310 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
21320 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
21330 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66  ure and as proof
21340 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a   that there is.*
21350 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  * already a read
21360 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
21370 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
21380 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
21390 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  r indicates how 
213a0 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79  much space in by
213b0 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66  tes to reserve f
213c0 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  or a.** master j
213d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65  ournal file-name
213e0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
213f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65   the journal whe
21400 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
21410 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
21420 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
21430 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
21440 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
21450 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a    For temporary.
21460 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ** files, the op
21470 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
21480 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
21490 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
214a0 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61  e is an.** actua
214b0 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
214c0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
214d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
214e0 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
214f0 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72   reserved for wr
21500 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74  iting, this rout
21510 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
21520 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20  **.** If exFlag 
21530 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61  is true, go ahea
21540 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43  d and get an EXC
21550 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
21560 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64  he file.** immed
21570 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f  iately instead o
21580 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20  f waiting until 
21590 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20  we try to flush 
215a0 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a  the cache.  The.
215b0 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e  ** exFlag is ign
215c0 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61  ored if a transa
215d0 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
215e0 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
215f0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
21600 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69  n(DbPage *pPg, i
21610 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61  nt exFlag){.  Pa
21620 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
21630 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
21640 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21650 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
21660 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
21670 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
21680 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21690 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
216a0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  NLOCK );.  if( p
216b0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
216c0 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
216d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
216e0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
216f0 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
21700 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
21710 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
21720 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
21730 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
21740 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
21750 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Size;.    }else{
21760 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
21770 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
21780 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c  ->fd, RESERVED_L
21790 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
217a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
217b0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
217c0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
217d0 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20  ESERVED;.       
217e0 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20   if( exFlag ){. 
217f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
21800 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
21810 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
21820 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
21830 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21840 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21850 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
21860 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
21870 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
21880 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
21890 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
218a0 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
218b0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54    PAGERTRACE2("T
218c0 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
218d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
218e0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ));.      if( pP
218f0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
21900 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
21910 70 46 69 6c 65 0a 20 20 20 20 20 20 20 20 20 20  pFile.          
21920 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
21930 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
21940 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
21950 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21960 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
21970 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
21980 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
21990 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
219a0 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
219b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
219c0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
219d0 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
219e0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
219f0 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
21a00 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20  s mode last.    
21a10 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20  ** time a (read 
21a20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
21a30 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
21a40 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  sfully concluded
21a50 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
21a60 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74  connection. Inst
21a70 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20  ead of deleting 
21a80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21a90 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20   it was .    ** 
21aa0 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72  kept open and tr
21ab0 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
21ac0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  es..    */.    a
21ad0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
21ae0 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
21af0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
21b00 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  igDbSize==0 );. 
21b10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
21b20 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
21b30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
21b40 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
21b50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72  ager);.    pager
21b60 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
21b70 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
21b80 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
21b90 69 74 76 65 63 43 72 65 61 74 65 28 20 70 50 61  itvecCreate( pPa
21ba0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 20  ger->dbSize );. 
21bb0 20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50     pagerEnter(pP
21bc0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 21  ager);.    if( !
21bd0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
21be0 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
21bf0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21c10 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
21c20 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
21c30 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ize;.      rc = 
21c40 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
21c50 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
21c60 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 50   }.  assert( !pP
21c70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
21c80 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n || pPager->jou
21c90 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21  rnalOff>0 || rc!
21ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
21cb0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
21cc0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
21cd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
21ce0 20 70 61 67 65 20 64 69 72 74 79 2e 20 20 53 65   page dirty.  Se
21cf0 74 20 69 74 73 20 64 69 72 74 79 20 66 6c 61 67  t its dirty flag
21d00 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20 74   and add it to t
21d10 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61 67 65  he dirty.** page
21d20 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
21d30 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74 79 28   void makeDirty(
21d40 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
21d50 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30  f( pPg->dirty==0
21d60 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
21d70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
21d80 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  ger;.    pPg->di
21d90 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  rty = 1;.    pPg
21da0 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65  ->pDirty = pPage
21db0 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 69  r->pDirty;.    i
21dc0 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74  f( pPager->pDirt
21dd0 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  y ){.      pPage
21de0 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76  r->pDirty->pPrev
21df0 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 20  Dirty = pPg;.   
21e00 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65   }.    pPg->pPre
21e10 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  vDirty = 0;.    
21e20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
21e30 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   pPg;.  }.}../*.
21e40 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 63  ** Make a page c
21e50 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69 74 73  lean.  Clear its
21e60 20 64 69 72 74 79 20 62 69 74 20 61 6e 64 20 72   dirty bit and r
21e70 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
21e80 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
21e90 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
21ea0 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50  void makeClean(P
21eb0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
21ec0 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
21ed0 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
21ee0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   0;.    if( pPg-
21ef0 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  >pDirty ){.     
21f00 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 44   assert( pPg->pD
21f10 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
21f20 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 70  ==pPg );.      p
21f30 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  Pg->pDirty->pPre
21f40 76 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 50  vDirty = pPg->pP
21f50 72 65 76 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  revDirty;.    }.
21f60 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
21f70 65 76 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  evDirty ){.     
21f80 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
21f90 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79  revDirty->pDirty
21fa0 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 70  ==pPg );.      p
21fb0 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e  Pg->pPrevDirty->
21fc0 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44  pDirty = pPg->pD
21fd0 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  irty;.    }else{
21fe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21ff0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72  Pg->pPager->pDir
22000 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20  ty==pPg );.     
22010 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44   pPg->pPager->pD
22020 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72  irty = pPg->pDir
22030 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ty;.    }.  }.}.
22040 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
22050 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
22060 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65  eable.  The page
22070 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
22080 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   the journal .**
22090 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
220a0 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68  ere already.  Th
220b0 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
220c0 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
220d0 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67   making.** chang
220e0 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a  es to a page..**
220f0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
22100 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
22110 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
22120 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e  ager creates a n
22130 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ew.** journal an
22140 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53  d acquires a RES
22150 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
22160 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
22170 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  the RESERVED.** 
22180 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
22190 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
221a0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
221b0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
221c0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
221d0 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
221e0 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
221f0 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
22200 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
22210 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
22220 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
22230 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
22240 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
22250 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
22260 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
22270 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
22280 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
22290 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
222a0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
222b0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
222c0 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
222d0 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
222e0 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
222f0 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
22300 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
22310 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
22320 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
22330 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
22340 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
22350 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
22360 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f   to.** reset..*/
22370 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
22380 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
22390 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61  Pg){.  void *pDa
223a0 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  ta = PGHDR_TO_DA
223b0 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65 72  TA(pPg);.  Pager
223c0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
223d0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
223e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
223f0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
22400 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rors.  */.  if( 
22410 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
22420 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
22430 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
22440 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
22450 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
22460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22470 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  PERM;.  }..  ass
22480 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
22490 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
224a0 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
224b0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
224c0 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
224d0 20 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e   acquired with n
224e0 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61  oContent==1, tha
224f0 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20  t means.  ** we 
22500 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20 72 65  didn't really re
22510 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ad in the conten
22520 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20  t of the page.  
22530 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a  This can happen.
22540 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c    ** (for exampl
22550 65 29 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  e) when the page
22560 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65 64 20   is being moved 
22570 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
22580 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77    But.  ** now w
22590 65 20 61 72 65 20 28 70 65 72 68 61 70 73 29 20  e are (perhaps) 
225a0 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65 20  moving the page 
225b0 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c  off of the freel
225c0 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75  ist for.  ** reu
225d0 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74  se and we need t
225e0 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67 69  o know its origi
225f0 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74  nal content so t
22600 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a  hat content.  **
22610 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69   can be stored i
22620 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
22630 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74  ournal.  So do t
22640 68 65 20 72 65 61 64 20 61 74 20 74 68 69 73 0a  he read at this.
22650 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a    ** time..  */.
22660 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74    rc = pager_get
22670 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
22680 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
22690 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
226a0 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
226b0 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
226c0 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
226d0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
226e0 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
226f0 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
22700 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
22710 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65  way..  */.  make
22720 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
22730 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
22740 20 26 26 20 28 70 61 67 65 49 6e 53 74 61 74 65   && (pageInState
22750 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50 61  ment(pPg) || pPa
22760 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
22770 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
22780 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
22790 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
227a0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
227b0 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
227c0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
227d0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
227e0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
227f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
22800 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
22810 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
22820 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
22830 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
22840 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
22850 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
22860 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
22870 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
22880 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
22890 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
228a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
228b0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
228c0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
228d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
228e0 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20  egin(pPg, 0);.  
228f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22900 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
22910 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
22920 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22930 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
22940 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
22950 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
22960 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
22970 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  r->useJournal.  
22980 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
22990 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
229a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
229b0 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72  E_OFF ){.      r
229c0 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
229d0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
229e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
229f0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
22a00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
22a10 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
22a20 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a  e = 1;.  .    /*
22a30 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
22a40 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
22a50 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
22a60 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
22a70 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
22a80 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
22a90 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
22aa0 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
22ab0 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
22ac0 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
22ad0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
22ae0 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
22af0 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
22b00 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a     if( !pPg->inJ
22b10 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65  ournal && (pPage
22b20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
22b30 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20  | MEMDB) ){.    
22b40 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
22b50 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
22b60 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
22b70 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
22b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48  ){.          PgH
22b90 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
22ba0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
22bb0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
22bc0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
22bd0 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  3("JOURNAL %d pa
22be0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
22bf0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
22c00 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
22c10 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
22c20 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20  pOrig==0 );.    
22c30 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72        pHist->pOr
22c40 69 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ig = sqlite3_mal
22c50 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67  loc( pPager->pag
22c60 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
22c70 20 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e 70     if( !pHist->p
22c80 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Orig ){.        
22c90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22ca0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
22cb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
22cc0 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72  emcpy(pHist->pOr
22cd0 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  ig, PGHDR_TO_DAT
22ce0 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
22cf0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
22d00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22d10 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20      u32 cksum;. 
22d20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
22d30 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20  Data2;..        
22d40 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
22d50 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
22d60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
22d70 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
22d80 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
22d90 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
22da0 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
22db0 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
22dc0 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20 20  ifies.          
22dd0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
22de0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
22df0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
22e00 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
22e10 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
22e20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 43        pData2 = C
22e30 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
22e40 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
22e50 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b  7);.          ck
22e60 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
22e70 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
22e80 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20  Data2);.        
22e90 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
22ea0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
22eb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22ec0 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ff, pPg->pgno);.
22ed0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
22ee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22ef0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
22f00 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
22f10 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
22f20 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
22f30 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
22f60 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20  urnalOff + 4);. 
22f70 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
22f80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
22f90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
22fa0 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  e+4;.          }
22fb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
22fc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22fe0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
22ff0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
23000 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b  ->journalOff, ck
23010 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sum);.          
23020 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
23030 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20  lOff += 4;.     
23040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23050 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
23060 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
23070 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
23080 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
23090 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
230a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61  >journalOff, pPa
230b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b  ger->pageSize));
230c0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
230d0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
230e0 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
230f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  );.          PAG
23100 45 52 54 52 41 43 45 35 28 22 4a 4f 55 52 4e 41  ERTRACE5("JOURNA
23110 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
23120 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
23130 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
23140 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
23150 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
23160 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
23170 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
23180 28 70 50 67 29 29 3b 0a 0a 20 20 20 20 20 20 20  (pPg));..       
23190 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68     /* An error h
231a0 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69  as occured writi
231b0 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
231c0 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20  l file. The .   
231d0 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
231e0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f  ction will be ro
231f0 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65  lled back by the
23200 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20   layer above..  
23210 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
23220 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23230 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23240 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
23250 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
23260 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
23270 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
23280 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23290 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
232a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
232b0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
232c0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
232d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
232e0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
232f0 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
23300 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20  >noSync;.       
23310 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
23320 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
23330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
23340 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
23350 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70  >pInStmt, pPg->p
23360 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
23370 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
23380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23390 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
233a0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
233b0 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
233c0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
233d0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34       PAGERTRACE4
233e0 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
233f0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
23400 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
23410 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
23420 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
23430 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  pPg->needSync);.
23440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
23450 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
23460 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
23470 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
23480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
23490 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
234a0 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  1;.    }.  .    
234b0 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
234c0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
234d0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
234e0 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
234f0 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65     ** then write
23500 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
23510 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  e to the stateme
23520 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74  nt journal.  Not
23530 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
23540 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
23550 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
23560 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
23570 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
23580 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  mat.    ** in th
23590 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20  at it omits the 
235a0 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68  checksums and th
235b0 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
235c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
235d0 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 20  >stmtInUse .    
235e0 20 26 26 20 21 70 61 67 65 49 6e 53 74 61 74 65   && !pageInState
235f0 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20 20 20  ment(pPg) .     
23600 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
23610 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
23620 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ize .    ){.    
23630 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
23640 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
23650 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
23660 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
23670 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42  .      if( MEMDB
23680 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
23690 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
236a0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
236b0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
236c0 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
236d0 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->pStmt==0 );.  
236e0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
236f0 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  mt = sqlite3_mal
23700 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67  loc( pPager->pag
23710 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
23720 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
23730 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
23740 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74  emcpy(pHist->pSt
23750 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  mt, PGHDR_TO_DAT
23760 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
23770 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
23780 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47     }.        PAG
23790 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a  ERTRACE3("STMT-J
237a0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
237b0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
237c0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
237d0 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f  );.        page_
237e0 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
237f0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  (pPg);.      }el
23800 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  se{.        i64 
23810 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  offset = pPager-
23820 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61  >stmtNRec*(4+pPa
23830 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
23840 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
23850 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
23860 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
23870 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
23880 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
23890 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 74 66  bits(pPager->stf
238a0 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
238b0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
238c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
238d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
238e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
238f0 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  e(pPager->stfd, 
23900 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
23910 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
23920 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +4);.        }. 
23930 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
23940 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
23950 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
23960 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
23970 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
23980 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
239a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
239b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
239c0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
239d0 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
239e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
239f0 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt!=0 );.     
23a00 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
23a10 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53  Set(pPager->pInS
23a20 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  tmt, pPg->pgno);
23a30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23a40 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
23a50 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
23a60 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
23a70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
23a80 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
23a90 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66  R_SHARED );.  if
23aa0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
23ab0 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  <(int)pPg->pgno 
23ac0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
23ad0 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
23ae0 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  o;.    if( !MEMD
23af0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  B && pPager->dbS
23b00 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ize==PENDING_BYT
23b10 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  E/pPager->pageSi
23b20 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
23b30 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20  er->dbSize++;.  
23b40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
23b50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
23b60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
23b70 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61  sed to mark a da
23b80 74 61 2d 70 61 67 65 20 61 73 20 77 72 69 74 61  ta-page as writa
23b90 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a  ble. It uses .**
23ba0 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 74   pager_write() t
23bb0 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c  o open a journal
23bc0 20 66 69 6c 65 20 28 69 66 20 69 74 20 69 73 20   file (if it is 
23bd0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
23be0 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  ).** and write t
23bf0 68 65 20 70 61 67 65 20 2a 70 44 61 74 61 20 74  he page *pData t
23c00 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
23c10 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
23c20 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
23c30 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61   function and pa
23c40 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74  ger_write() is t
23c50 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hat this.** func
23c60 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20  tion also deals 
23c70 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
23c80 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72   case where 2 or
23c90 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66   more pages.** f
23ca0 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64  it on a single d
23cb0 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74  isk sector. In t
23cc0 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d  his case all co-
23cd0 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a  resident pages.*
23ce0 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  * must have been
23cf0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
23d00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
23d10 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
23d20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
23d30 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  erWrite(DbPage *
23d40 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  pDbPage){.  int 
23d50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23d60 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
23d70 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
23d80 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
23d90 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e  pPager;.  Pgno n
23da0 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20  PagePerSector = 
23db0 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
23dc0 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  ize/pPager->page
23dd0 53 69 7a 65 29 3b 0a 0a 20 20 70 61 67 65 72 45  Size);..  pagerE
23de0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
23df0 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 50  if( !MEMDB && nP
23e00 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29  agePerSector>1 )
23e10 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  {.    Pgno nPage
23e20 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Count;          
23e30 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
23e40 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
23e50 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
23e60 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20   Pgno pg1;      
23e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23e80 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
23e90 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
23ea0 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20  cated on. */.   
23eb0 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
23ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
23ed0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
23ee0 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f  arting at pg1 to
23ef0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
23f00 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20  int ii;.    int 
23f10 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
23f20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f     /* Set the do
23f30 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20  NotSync flag to 
23f40 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
23f50 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  se we cannot all
23f60 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ow a journal.   
23f70 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65   ** header to be
23f80 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e   written between
23f90 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e   the pages journ
23fa0 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  aled by this fun
23fb0 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
23fc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23fd0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29  ->doNotSync==0 )
23fe0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
23ff0 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20  NotSync = 1;..  
24000 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20    /* This trick 
24010 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74  assumes that bot
24020 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  h the page-size 
24030 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
24040 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  are.    ** an in
24050 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
24060 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
24070 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
24080 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20  entifier.    ** 
24090 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
240a0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
240b0 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
240c0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  n..    */.    pg
240d0 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d  1 = ((pPg->pgno-
240e0 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53  1) & ~(nPagePerS
240f0 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a  ector-1)) + 1;..
24100 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d      nPageCount =
24110 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
24120 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
24130 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
24140 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  o>nPageCount ){.
24150 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70        nPage = (p
24160 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b  Pg->pgno - pg1)+
24170 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
24180 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65   (pg1+nPagePerSe
24190 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75  ctor-1)>nPageCou
241a0 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
241b0 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31  e = nPageCount+1
241c0 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -pg1;.    }else{
241d0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
241e0 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20  PagePerSector;. 
241f0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
24200 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73  nPage>0);.    as
24210 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70  sert(pg1<=pPg->p
24220 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
24230 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67  ((pg1+nPage)>pPg
24240 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f  ->pgno);..    fo
24250 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
24260 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
24270 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  K; ii++){.      
24280 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69  Pgno pg = pg1+ii
24290 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  ;.      PgHdr *p
242a0 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Page;.      if( 
242b0 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c  pg==pPg->pgno ||
242c0 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
242d0 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
242e0 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20  ournal, pg) ){. 
242f0 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50         if( pg!=P
24300 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
24310 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
24320 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
24330 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
24340 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  g, &pPage);.    
24350 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
24360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24370 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
24380 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
24390 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
243a0 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20  pPage->needSync 
243b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
243c0 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
243d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
243e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
243f0 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
24400 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
24410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24420 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
24430 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
24440 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29  Pager, pg))!=0 )
24450 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
24460 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  age->needSync ){
24470 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
24480 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
24490 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
244a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
244b0 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66  PgHdr.needSync f
244c0 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61  lag is set for a
244d0 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20  ny of the nPage 
244e0 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74  pages .    ** st
244f0 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74  arting at pg1, t
24500 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20  hen it needs to 
24510 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f  be set for all o
24520 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a  f them. Because.
24530 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74      ** writing t
24540 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e  o any of these n
24550 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64  Page pages may d
24560 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73  amage the others
24570 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  , the.    ** jou
24580 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63  rnal file must c
24590 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20  ontain sync()ed 
245a0 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66  copies of all of
245b0 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66   them.    ** bef
245c0 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  ore any of them 
245d0 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f  can be written o
245e0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
245f0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
24600 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
24610 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 69   ){.      for(ii
24620 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
24630 6e 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b  needSync; ii++){
24640 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
24650 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
24660 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31  okup(pPager, pg1
24670 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii);.        if
24680 28 20 70 50 61 67 65 20 29 20 70 50 61 67 65 2d  ( pPage ) pPage-
24690 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
246a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
246b0 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
246c0 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Sync);.    }..  
246d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
246e0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29  ->doNotSync==1 )
246f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
24700 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  NotSync = 0;.  }
24710 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
24720 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61  ager_write(pDbPa
24730 67 65 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  ge);.  }.  pager
24740 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
24750 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24760 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
24770 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
24780 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
24790 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
247a0 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
247b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
247c0 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
247d0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
247e0 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
247f0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
24800 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
24810 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  e..*/.#ifndef ND
24820 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
24830 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
24840 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
24850 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72   return pPg->dir
24860 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ty;.}.#endif..#i
24870 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24880 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52  T_VACUUM./*.** R
24890 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65  eplace the conte
248a0 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  nt of a single p
248b0 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66  age with the inf
248c0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
248d0 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  third.** argumen
248e0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
248f0 33 50 61 67 65 72 4f 76 65 72 77 72 69 74 65 28  3PagerOverwrite(
24900 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
24910 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
24920 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
24930 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
24940 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
24950 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ager);.  rc = sq
24960 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
24970 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67  ager, pgno, &pPg
24980 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
24990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
249a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
249b0 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69  rite(pPg);.    i
249c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
249d0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
249e0 28 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  (sqlite3PagerGet
249f0 44 61 74 61 28 70 50 67 29 2c 20 70 44 61 74 61  Data(pPg), pData
24a00 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
24a10 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ze);.    }.    s
24a20 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
24a30 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
24a40 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
24a50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24a60 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
24a70 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
24a80 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
24a90 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
24aa0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
24ab0 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
24ac0 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
24ad0 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68  e pPg back to th
24ae0 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
24af0 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
24b00 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
24b10 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a   as dirty..**.**
24b20 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
24b30 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
24b40 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
24b50 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
24b60 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
24b70 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
24b80 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72  used.  The pager
24b90 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
24ba0 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
24bb0 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
24bc0 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
24bd0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
24be0 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
24bf0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
24c00 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a  gether with the.
24c10 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  ** sqlite3PagerD
24c20 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  ontRollback() be
24c30 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64  low, more than d
24c40 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a  ouble the speed.
24c50 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45  ** of large INSE
24c60 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e  RT operations an
24c70 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  d quadruple the 
24c80 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44  speed of large D
24c90 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ELETEs..**.** Wh
24ca0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
24cb0 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74  is called, set t
24cc0 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  he alwaysRollbac
24cd0 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a  k flag to true..
24ce0 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
24cf0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
24d00 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
24d10 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70  ) for the same p
24d20 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72  age.** will ther
24d30 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65  eafter be ignore
24d40 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  d.  This is nece
24d50 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61  ssary to avoid a
24d60 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72   problem.** wher
24d70 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61  e a page with da
24d80 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ta is added to t
24d90 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
24da0 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a  ng one part of.*
24db0 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * a transaction 
24dc0 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f  then removed fro
24dd0 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  m the freelist d
24de0 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61  uring a later pa
24df0 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  rt.** of the sam
24e00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
24e10 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
24e20 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e  e other purpose.
24e30 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20    When it.** is 
24e40 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74  first added to t
24e50 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69  he freelist, thi
24e60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
24e70 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65  led.  When reuse
24e80 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  d,.** the sqlite
24e90 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
24ea0 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  ck() routine is 
24eb0 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63  called.  But bec
24ec0 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  ause the.** page
24ed0 20 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63   contains critic
24ee0 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c  al data, we stil
24ef0 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72  l need to be sur
24f00 65 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c  e it gets.** rol
24f10 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74  led back in spit
24f20 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  e of the sqlite3
24f30 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
24f40 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69  k() call..*/.voi
24f50 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
24f60 6e 74 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  ntWrite(DbPage *
24f70 70 44 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64  pDbPage){.  PgHd
24f80 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
24f90 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
24fa0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
24fb0 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20  ..  if( MEMDB ) 
24fc0 72 65 74 75 72 6e 3b 0a 20 20 70 61 67 65 72 45  return;.  pagerE
24fd0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
24fe0 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
24ff0 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  ack = 1;.  if( p
25000 50 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50  Pg->dirty && !pP
25010 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
25020 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
25030 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
25040 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
25050 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
25060 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e  Size==(int)pPg->
25070 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e  pgno && pPager->
25080 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65  origDbSize<pPage
25090 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
250a0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61     /* If this pa
250b0 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20  ges is the last 
250c0 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
250d0 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
250e0 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a  s grown.      **
250f0 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
25100 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
25110 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72   then do NOT mar
25120 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
25130 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68  ean..      ** Wh
25140 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
25150 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d  file grows, we m
25160 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ust make sure th
25170 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
25180 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77  .      ** gets w
25190 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20  ritten at least 
251a0 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65  once so that the
251b0 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20   disk file will 
251c0 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  be the correct. 
251d0 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66       ** size. If
251e0 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74   you do not writ
251f0 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20  e this page and 
25200 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
25210 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  file.      ** on
25220 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75   the disk ends u
25230 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c  p being too smal
25240 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64  l, that can lead
25250 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20   to database.   
25260 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e     ** corruption
25270 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74   during the next
25280 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
25290 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65      */.    }else
252a0 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
252b0 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE3("DONT_WRITE 
252c0 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
252d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
252e0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
252f0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
25300 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
25310 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
25320 29 29 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  )).      makeCle
25330 61 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20  an(pPg);.#ifdef 
25340 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
25350 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  ES.      pPg->pa
25360 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
25370 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
25380 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ndif.    }.  }. 
25390 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
253a0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  er);.}../*.** A 
253b0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
253c0 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
253d0 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72  ager that if a r
253e0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a  ollback occurs,.
253f0 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ** it is not nec
25400 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72  essary to restor
25410 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68  e the data on th
25420 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54  e given page.  T
25430 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  his.** means tha
25440 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  t the pager does
25450 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63   not have to rec
25460 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61  ord the given pa
25470 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c  ge in the.** rol
25480 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
25490 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20  *.** If we have 
254a0 6e 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79  not yet actually
254b0 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
254c0 74 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 28  t of this page (
254d0 69 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e  if.** the PgHdr.
254e0 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 69 73  needRead flag is
254f0 20 73 65 74 29 20 74 68 65 6e 20 74 68 69 73 20   set) then this 
25500 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20  routine acts as 
25510 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61  a promise.** tha
25520 74 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  t we will never 
25530 6e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 65  need to read the
25540 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e   page content in
25550 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20   the future..** 
25560 73 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64 20  so the needRead 
25570 66 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61  flag can be clea
25580 72 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  red at this poin
25590 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
255a0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
255b0 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29  ack(DbPage *pPg)
255c0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
255d0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
255e0 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ..  pagerEnter(p
255f0 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
25600 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
25610 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
25620 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
25630 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
25640 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e  not open, or Don
25650 74 57 72 69 74 65 28 29 20 68 61 73 20 62 65 65  tWrite() has bee
25660 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a  n called on.  **
25670 20 74 68 69 73 20 70 61 67 65 20 28 44 6f 6e 74   this page (Dont
25680 57 72 69 74 65 28 29 20 73 65 74 73 20 74 68 65  Write() sets the
25690 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
256a0 66 6c 61 67 29 2c 20 74 68 65 6e 20 74 68 69 73  flag), then this
256b0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  .  ** function i
256c0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
256d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
256e0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20  urnalOpen==0 || 
256f0 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
25700 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61  ack || pPager->a
25710 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
25720 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
25730 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
25740 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
25750 74 28 20 21 4d 45 4d 44 42 20 29 3b 20 20 20 20  t( !MEMDB );    
25760 2f 2a 20 46 6f 72 20 61 20 6d 65 6d 64 62 2c 20  /* For a memdb, 
25770 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
25780 70 65 6e 20 69 73 20 61 6c 77 61 79 73 20 30 20  pen is always 0 
25790 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
257a0 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
257b0 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75    if( pPg->inJou
257c0 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
257d0 2d 3e 70 67 6e 6f 20 3e 20 70 50 61 67 65 72 2d  ->pgno > pPager-
257e0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
257f0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
25800 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53  endif..  /* If S
25810 45 43 55 52 45 5f 44 45 4c 45 54 45 20 69 73 20  ECURE_DELETE is 
25820 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
25830 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
25840 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 72 6f  hat this.  ** ro
25850 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c  utine can be cal
25860 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 20 66 6f  led on a page fo
25870 72 20 77 68 69 63 68 20 73 71 6c 69 74 65 33 50  r which sqlite3P
25880 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 0a  agerDontWrite().
25890 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65    ** has not bee
258a0 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  n previously cal
258b0 6c 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 73  led during the s
258c0 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ame transaction.
258d0 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 44 6f 6e  .  ** And if Don
258e0 74 57 72 69 74 65 28 29 20 68 61 73 20 70 72 65  tWrite() has pre
258f0 76 69 6f 75 73 6c 79 20 62 65 65 6e 20 63 61 6c  viously been cal
25900 6c 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  led, the followi
25910 6e 67 0a 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f  ng.  ** conditio
25920 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74 2e 0a  ns must be met..
25930 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
25940 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
25950 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
25960 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
25970 44 62 53 69 7a 65 20 29 3b 0a 0a 20 20 61 73 73  DbSize );..  ass
25980 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
25990 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
259a0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
259b0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
259c0 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
259d0 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  .  pPg->inJourna
259e0 6c 20 3d 20 31 3b 0a 20 20 70 50 67 2d 3e 6e 65  l = 1;.  pPg->ne
259f0 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 69 66  edRead = 0;.  if
25a00 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
25a10 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Use ){.    asser
25a20 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  t( pPager->stmtS
25a30 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 6f  ize >= pPager->o
25a40 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
25a50 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
25a60 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  t(pPager->pInStm
25a70 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
25a80 20 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45 33   }.  PAGERTRACE3
25a90 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  ("DONT_ROLLBACK 
25aa0 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
25ab0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
25ac0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
25ad0 20 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41   IOTRACE(("GARBA
25ae0 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  GE %p %d\n", pPa
25af0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
25b00 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
25b10 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ager);.}.../*.**
25b20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
25b30 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
25b40 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  ment the databas
25b50 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
25b60 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64  unter,.** stored
25b70 20 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74   at byte 24 of t
25b80 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
25b90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
25ba0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
25bb0 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  unter(Pager *pPa
25bc0 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63  ger, int isDirec
25bd0 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  t){.  PgHdr *pPg
25be0 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67  Hdr;.  u32 chang
25bf0 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74  e_counter;.  int
25c00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25c10 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
25c20 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
25c30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20   ){.    /* Open 
25c40 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69  page 1 of the fi
25c50 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20  le for writing. 
25c60 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
25c70 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
25c80 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b  er, 1, &pPgHdr);
25c90 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
25ca0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
25cb0 72 63 3b 0a 0a 20 20 20 20 69 66 28 20 21 69 73  rc;..    if( !is
25cc0 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Direct ){.      
25cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
25ce0 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a  rWrite(pPgHdr);.
25cf0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
25d00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25d10 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
25d20 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
25d30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
25d40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
25d50 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
25d60 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
25d70 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
25d80 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
25d90 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65  4. */.    change
25da0 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74  _counter = sqlit
25db0 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29  e3Get4byte((u8*)
25dc0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
25dd0 72 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f  rs);.    change_
25de0 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70  counter++;.    p
25df0 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
25e00 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
25e10 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e  PgHdr))+24, chan
25e20 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
25e30 20 20 69 66 28 20 69 73 44 69 72 65 63 74 20 26    if( isDirect &
25e40 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  & pPager->fd->pM
25e50 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
25e60 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
25e70 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
25e80 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20  (pPgHdr);.      
25e90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
25ea0 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
25eb0 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
25ec0 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  geSize, 0);.    
25ed0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
25ee0 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
25ef0 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
25f00 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
25f10 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67  PgHdr);.    pPag
25f20 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
25f30 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  one = 1;.  }.  r
25f40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25f50 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65  ** Sync the page
25f60 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 0a  r file to disk..
25f70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
25f80 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70  gerSync(Pager *p
25f90 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
25fa0 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
25fb0 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73  Pager);.  rc = s
25fc0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
25fd0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
25fe0 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
25ff0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
26000 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
26010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
26020 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26030 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
26040 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
26050 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
26060 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
26070 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
26080 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
26090 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
260a0 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
260b0 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
260c0 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
260d0 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
260e0 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
260f0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
26100 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
26110 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
26120 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
26130 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
26140 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
26150 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ed, all dirty pa
26160 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ges written.** t
26170 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
26180 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ile and the data
26190 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
261a0 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  . The only thing
261b0 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73   that.** remains
261c0 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
261d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
261e0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
261f0 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20  nal file (or.** 
26200 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
26210 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
26220 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
26230 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
26240 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
26250 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
26260 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
26270 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
26280 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
26290 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e  PhaseOne() call.
262a0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
262b0 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f  ter nTrunc is no
262c0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
262d0 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74   pager file is t
262e0 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e  runcated to.** n
262f0 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69  Trunc pages (thi
26300 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74  s is used by aut
26310 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
26320 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es)..**.** If th
26330 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
26340 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20  r - noSync - is 
26350 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
26360 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
26370 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79  elf.** is not sy
26380 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  nced. The caller
26390 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74   must call sqlit
263a0 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69  e3PagerSync() di
263b0 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e  rectly to.** syn
263c0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
263d0 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
263e0 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  ng CommitPhaseTw
263f0 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68  o() to delete th
26400 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
26410 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
26420 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
26430 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
26440 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
26450 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  er, .  const cha
26460 72 20 2a 7a 4d 61 73 74 65 72 2c 20 0a 20 20 50  r *zMaster, .  P
26470 67 6e 6f 20 6e 54 72 75 6e 63 2c 0a 20 20 69 6e  gno nTrunc,.  in
26480 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a 20 20 69 6e  t noSync.){.  in
26490 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
264a0 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  ;..  PAGERTRACE4
264b0 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
264c0 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
264d0 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22  =%s nTrunc=%d\n"
264e0 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
264f0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
26500 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ter, nTrunc);.  
26510 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
26520 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  r);..  /* If thi
26530 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
26540 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
26550 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
26560 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
26570 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
26580 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
26590 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
265a0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
265b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
265c0 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20  PAGER_SYNCED && 
265d0 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
265e0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a  ->dirtyCache ){.
265f0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
26600 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
26610 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
26620 54 45 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74  TE.    /* The at
26630 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
26640 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
26650 73 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  sed if all of th
26660 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
26670 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
26680 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20   **.    **    + 
26690 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  The file-system 
266a0 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f  supports the ato
266b0 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
266c0 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20  ty for.    **   
266d0 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a     blocks of siz
266e0 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64  e page-size, and
266f0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 69  .    **    + Thi
26700 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20  s commit is not 
26710 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
26720 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  file transaction
26730 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20  , and.    **    
26740 2b 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  + Exactly one pa
26750 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ge has been modi
26760 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69  fied and store i
26770 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
26780 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
26790 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
267a0 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
267b0 64 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  d, then the jour
267c0 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65  nal file will ne
267d0 76 65 72 0a 20 20 20 20 2a 2a 20 62 65 20 63 72  ver.    ** be cr
267e0 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74  eated for this t
267f0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
26800 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 65 41 74  */.    int useAt
26810 6f 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20  omicWrite = (.  
26820 20 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26        !zMaster &
26830 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
26840 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
26850 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
26860 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72  ->journalOff==jr
26870 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
26880 67 65 72 29 20 26 26 20 0a 20 20 20 20 20 20 20  ger) && .       
26890 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a 20   nTrunc==0 && . 
268a0 20 20 20 20 20 20 20 28 30 3d 3d 70 50 61 67 65         (0==pPage
268b0 72 2d 3e 70 44 69 72 74 79 20 7c 7c 20 30 3d 3d  r->pDirty || 0==
268c0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e  pPager->pDirty->
268d0 70 44 69 72 74 79 29 0a 20 20 20 20 29 3b 0a 20  pDirty).    );. 
268e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
268f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
26900 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
26910 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
26920 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a  RNALMODE_OFF );.
26930 20 20 20 20 69 66 28 20 75 73 65 41 74 6f 6d 69      if( useAtomi
26940 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20  cWrite ){.      
26950 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e 52  /* Update the nR
26960 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ec field in the 
26970 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
26980 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73 65  .      int offse
26990 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
269a0 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
269b0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a  aJournalMagic);.
269c0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
269d0 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20  ger->nRec==1);. 
269e0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
269f0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
26a00 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67 65  d, offset, pPage
26a10 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
26a20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
26a30 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f  b file change co
26a40 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  unter. The follo
26a50 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d  wing call will m
26a60 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74  odify.      ** t
26a70 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
26a80 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  resentation of p
26a90 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64 65  age 1 to include
26aa0 20 74 68 65 20 75 70 64 61 74 65 64 0a 20 20 20   the updated.   
26ab0 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75     ** change cou
26ac0 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72  nter and then wr
26ad0 69 74 65 20 70 61 67 65 20 31 20 64 69 72 65 63  ite page 1 direc
26ae0 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62  tly to the datab
26af0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
26b00 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68  e. Because of th
26b10 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70  e atomic-write p
26b20 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68  roperty of the h
26b30 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  ost file-system,
26b40 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
26b50 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a  is safe..      *
26b60 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
26b70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26b80 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
26b90 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
26ba0 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  er(pPager, 1);. 
26bb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
26bc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
26bd0 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
26be0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
26bf0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
26c00 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 26  useAtomicWrite &
26c10 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
26c20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ).#endif..    /*
26c30 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
26c40 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
26c50 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
26c60 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20  written to the. 
26c70 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
26c80 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63  le, then no sync
26c90 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68   is required. Th
26ca0 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
26cb0 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69  it is.    ** wri
26cc0 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70  tten, then the p
26cd0 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20  rocess fails to 
26ce0 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
26cf0 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20  ESERVED to an.  
26d00 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
26d10 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69  ock. The next ti
26d20 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  me the process t
26d30 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ries to commit t
26d40 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
26d50 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61  ction the m-j na
26d60 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  me will have alr
26d70 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
26d80 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
26d90 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
26da0 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63  ster ){.      rc
26db0 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
26dc0 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
26dd0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  er, 0);.      if
26de0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26df0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
26e00 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
26e10 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
26e20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e  .      if( nTrun
26e30 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
26e40 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73  /* If this trans
26e50 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20  action has made 
26e60 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61  the database sma
26e70 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70  ller, then all p
26e80 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ages.        ** 
26e90 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20  being discarded 
26ea0 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  by the truncatio
26eb0 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  n must be writte
26ec0 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
26ed0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
26ee0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
26ef0 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20       Pgno i;.   
26f00 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d       int iSkip =
26f10 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
26f20 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
26f30 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b  for( i=nTrunc+1;
26f40 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67   i<=pPager->orig
26f50 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20  DbSize; i++ ){. 
26f60 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
26f70 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
26f80 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
26f90 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b  al, i) && i!=iSk
26fa0 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ip ){.          
26fb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26fc0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69  gerGet(pPager, i
26fd0 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20  , &pPg);.       
26fe0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26ff0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
27000 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
27010 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27020 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29  3PagerWrite(pPg)
27030 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
27040 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
27050 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
27060 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27070 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
27080 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
27090 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20  }.        } .   
270a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
270b0 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
270c0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
270d0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
270e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
270f0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
27100 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  exit;.      rc =
27110 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
27120 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
27130 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27140 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
27150 69 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  it;..#ifndef SQL
27160 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
27170 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75  UUM.    if( nTru
27180 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  nc!=0 ){.      r
27190 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
271a0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  Truncate(pPager,
271b0 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20   nTrunc);.      
271c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
271d0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
271e0 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  it;.    }.#endif
271f0 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
27200 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
27210 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
27220 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  ile */.    pPg =
27230 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
27240 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
27250 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  r);.    rc = pag
27260 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
27270 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  t(pPg);.    if( 
27280 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27290 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
272a0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
272b0 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20  BLOCKED );.     
272c0 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 69   /* The error mi
272d0 67 68 74 20 68 61 76 65 20 6c 65 66 74 20 74 68  ght have left th
272e0 65 20 64 69 72 74 79 20 6c 69 73 74 20 61 6c 6c  e dirty list all
272f0 20 66 6f 75 6c 65 64 20 75 70 20 68 65 72 65 2c   fouled up here,
27300 0a 20 20 20 20 20 20 2a 2a 20 62 75 74 20 74 68  .      ** but th
27310 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  at does not matt
27320 65 72 20 62 65 63 61 75 73 65 20 69 66 20 74 68  er because if th
27330 65 20 69 66 20 74 68 65 20 64 69 72 74 79 20 6c  e if the dirty l
27340 69 73 74 20 64 69 64 0a 20 20 20 20 20 20 2a 2a  ist did.      **
27350 20 67 65 74 20 63 6f 72 72 75 70 74 65 64 2c 20   get corrupted, 
27360 74 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  then the transac
27370 74 69 6f 6e 20 77 69 6c 6c 20 72 6f 6c 6c 20 62  tion will roll b
27380 61 63 6b 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ack and.      **
27390 20 64 69 73 63 61 72 64 20 74 68 65 20 64 69 72   discard the dir
273a0 74 79 20 6c 69 73 74 2e 20 20 54 68 65 72 65 20  ty list.  There 
273b0 69 73 20 61 6e 20 61 73 73 65 72 74 20 69 6e 0a  is an assert in.
273c0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 67        ** pager_g
273d0 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
273e0 65 73 28 29 20 74 68 61 74 20 76 65 72 69 66 69  es() that verifi
273f0 65 73 20 74 68 61 74 20 6e 6f 20 61 74 74 65 6d  es that no attem
27400 70 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6d  pt.      ** is m
27410 61 64 65 20 74 6f 20 75 73 65 20 61 6e 20 69 6e  ade to use an in
27420 76 61 6c 69 64 20 64 69 72 74 79 20 6c 69 73 74  valid dirty list
27430 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
27440 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
27450 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
27460 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a  r->pDirty = 0;..
27470 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
27480 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
27490 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
274a0 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f  r->noSync && !no
274b0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
274c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
274d0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
274e0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
274f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
27500 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c  ACE(("DBSYNC %p\
27510 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20  n", pPager))..  
27520 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
27530 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a  = PAGER_SYNCED;.
27540 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44    }else if( MEMD
27550 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29  B && nTrunc!=0 )
27560 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
27570 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
27580 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b  pPager, nTrunc);
27590 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a  .  }..sync_exit:
275a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
275b0 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
275c0 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  ){.    /* pager_
275d0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
275e0 65 72 28 29 20 6d 61 79 20 61 74 74 65 6d 70 74  er() may attempt
275f0 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65 78   to obtain an ex
27600 63 6c 75 73 69 76 65 0a 20 20 20 20 20 2a 20 6c  clusive.     * l
27610 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68 65  ock to spill the
27620 20 63 61 63 68 65 20 61 6e 64 20 72 65 74 75 72   cache and retur
27630 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e  n IOERR_BLOCKED.
27640 20 42 75 74 20 73 69 6e 63 65 20 0a 20 20 20 20   But since .    
27650 20 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63   * there is no c
27660 68 61 6e 63 65 20 74 68 65 20 63 61 63 68 65 20  hance the cache 
27670 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c  is inconsistent,
27680 20 69 74 20 69 73 0a 20 20 20 20 20 2a 20 62 65   it is.     * be
27690 74 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 53  tter to return S
276a0 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
276b0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
276c0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  ITE_BUSY;.  }.  
276d0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
276e0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
276f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  .}.../*.** Commi
27700 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f  t all changes to
27710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
27720 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  d release the wr
27730 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ite lock..**.** 
27740 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61  If the commit fa
27750 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
27760 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61  on, a rollback a
27770 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a  ttempt is made.*
27780 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
27790 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
277a0 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
277b0 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f  worked, SQLITE_O
277c0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
277d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
277e0 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
277f0 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65  Two(Pager *pPage
27800 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
27810 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
27820 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
27830 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
27840 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
27850 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
27860 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
27870 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
27880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
27890 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  ROR;.  }.  pager
278a0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
278b0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4f   PAGERTRACE2("CO
278c0 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
278d0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
278e0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
278f0 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
27900 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
27910 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68  (pPager);.    wh
27920 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20  ile( pPg ){.    
27930 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
27940 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
27950 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
27960 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
27970 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20  ory(pHist);.    
27980 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
27990 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
279a0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
279b0 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20    pHist->inStmt 
279c0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
279d0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
279e0 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76      pHist->pPrev
279f0 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e  Stmt = pHist->pN
27a00 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
27a10 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44     pPg = pPg->pD
27a20 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
27a30 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
27a40 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   0;.#ifndef NDEB
27a50 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  UG.    for(pPg=p
27a60 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
27a70 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
27a80 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
27a90 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
27aa0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
27ab0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
27ac0 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61   assert( !pPg->a
27ad0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
27ae0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
27af0 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a  pHist->pOrig );.
27b00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
27b10 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  Hist->pStmt );. 
27b20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
27b30 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
27b40 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
27b50 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
27b60 52 45 44 3b 0a 20 20 20 20 70 61 67 65 72 4c 65  RED;.    pagerLe
27b70 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
27b80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27b90 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
27ba0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
27bb0 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20  PAGER_SYNCED || 
27bc0 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
27bd0 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  che );.  rc = pa
27be0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
27bf0 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ion(pPager);.  r
27c00 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
27c10 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70  pPager, rc);.  p
27c20 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
27c30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27c40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
27c50 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20  k all changes.  
27c60 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
27c70 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
27c80 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
27c90 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   All in-memory c
27ca0 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72  ache pages rever
27cb0 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69  t to their origi
27cc0 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74  nal data content
27cd0 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  s..** The journa
27ce0 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  l is deleted..**
27cf0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
27d00 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c   cannot fail unl
27d10 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ess some other p
27d20 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
27d30 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63  llowing.** the c
27d40 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70  orrect locking p
27d50 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73  rotocol or unles
27d60 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  s some other.** 
27d70 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
27d80 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68  ng trash into th
27d90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
27da0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20  SQLITE_CORRUPT) 
27db0 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70  or.** unless a p
27dc0 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61  rior malloc() fa
27dd0 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  iled (SQLITE_NOM
27de0 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74  EM).  Appropriat
27df0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73  e error.** codes
27e00 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f   are returned fo
27e10 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61  r all these occa
27e20 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73  sions.  Otherwis
27e30 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  e,.** SQLITE_OK 
27e40 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
27e50 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
27e60 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
27e70 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
27e80 63 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  c;.  PAGERTRACE2
27e90 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
27ea0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
27eb0 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
27ec0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
27ed0 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65  .    for(p=pPage
27ee0 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
27ef0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
27f00 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
27f10 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
27f20 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ( !p->alwaysRoll
27f30 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66  back );.      if
27f40 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  ( !p->dirty ){. 
27f50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
27f60 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
27f70 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
27f80 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29  Pager))->pOrig )
27f90 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
27fa0 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
27fb0 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
27fc0 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d  , pPager))->pStm
27fd0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t );.        con
27fe0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
27ff0 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
28000 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
28010 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
28020 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
28030 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
28040 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
28050 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
28060 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
28070 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  e);.        PAGE
28080 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43  RTRACE3("ROLLBAC
28090 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c  K-PAGE %d of %d\
280a0 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
280b0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
280c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
280d0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
280e0 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61  "PAGE %d is clea
280f0 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  n on %d\n", p->p
28100 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
28110 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ger));.      }. 
28120 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
28130 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
28140 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
28150 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c      p->inJournal
28160 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
28170 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
28180 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
28190 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
281a0 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
281b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
281c0 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
281d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
281e0 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72  initer(p, pPager
281f0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
28200 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
28210 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
28220 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
28230 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
28240 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
28250 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
28260 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
28270 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
28280 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
28290 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
282a0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
282b0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
282c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
282d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
282e0 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
282f0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
28300 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20  ->dirtyCache || 
28310 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
28320 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
28330 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
28340 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
28350 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
28360 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
28370 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
28380 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
28390 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
283a0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
283b0 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
283c0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
283d0 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
283e0 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
283f0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
28400 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c      }.    pagerL
28410 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
28420 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
28430 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
28440 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
28450 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
28460 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  D ){.    int rc2
28470 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
28480 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
28490 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  , 0);.    rc2 = 
284a0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
284b0 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
284c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
284d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
284e0 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20   = rc2;.    }.  
284f0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
28500 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
28510 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  Pager, 0);.  }. 
28520 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74 28   /* pager_reset(
28530 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50  pPager); */.  pP
28540 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
28550 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  1;..  /* If an e
28560 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
28570 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77  ng a ROLLBACK, w
28580 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
28590 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a  trust the pager.
285a0 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63    ** cache. So c
285b0 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28  all pager_error(
285c0 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74  ) on the way out
285d0 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72   to make any err
285e0 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74  or .  ** persist
285f0 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ent..  */.  rc =
28600 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
28610 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65  ger, rc);.  page
28620 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
28630 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28640 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
28650 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
28660 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
28670 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
28680 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
28690 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
286a0 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
286b0 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
286c0 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
286d0 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
286e0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
286f0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
28700 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
28710 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
28720 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
28730 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
28740 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
28750 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
28760 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
28770 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64  r->nRef;.}..#ifd
28780 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
28790 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
287a0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
287b0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
287c0 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
287d0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
287e0 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
287f0 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
28800 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
28810 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20  pPager->nRef;.  
28820 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[1] = pPager->n
28830 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70  Page;.  a[2] = p
28840 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20  Pager->mxPage;. 
28850 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
28860 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d  dbSize;.  a[4] =
28870 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
28880 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
28890 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d  >errCode;.  a[6]
288a0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
288b0 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
288c0 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
288d0 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f  = 0;  /* Used to
288e0 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66   be pPager->nOvf
288f0 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50  l */.  a[9] = pP
28900 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61  ager->nRead;.  a
28910 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  [10] = pPager->n
28920 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
28930 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
28940 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65  ** Set the state
28950 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f  ment rollback po
28960 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
28970 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
28980 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
28990 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
289a0 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
289b0 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74   open.  A new st
289c0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
289d0 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20  is created that 
289e0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
289f0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67  ollback.** chang
28a00 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53  es of a single S
28a10 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69  QL command withi
28a20 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73  n a larger trans
28a30 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
28a40 63 20 69 6e 74 20 70 61 67 65 72 53 74 6d 74 42  c int pagerStmtB
28a50 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
28a60 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
28a70 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
28a80 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20  ->stmtInUse );. 
28a90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28aa0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
28ab0 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ARED );.  assert
28ac0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
28ad0 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  >=0 );.  PAGERTR
28ae0 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e  ACE2("STMT-BEGIN
28af0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
28b00 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
28b10 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
28b20 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
28b30 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
28b40 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
28b50 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72  r->dbSize;.    r
28b60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28b70 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
28b80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
28b90 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
28ba0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  tmtAutoopen = 1;
28bb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28bc0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
28bd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
28be0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 61  rnalOpen );.  pa
28bf0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
28c00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
28c10 65 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29  er->pInStmt==0 )
28c20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53  ;.  pPager->pInS
28c30 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  tmt = sqlite3Bit
28c40 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
28c50 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 70 61 67  ->dbSize);.  pag
28c60 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
28c70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
28c80 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  InStmt==0 ){.   
28c90 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   /* sqlite3OsLoc
28ca0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
28cb0 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20  ARED_LOCK); */. 
28cc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28cd0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50  _NOMEM;.  }.  pP
28ce0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
28cf0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
28d00 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e  lOff;.  pPager->
28d10 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
28d20 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61  r->dbSize;.  pPa
28d30 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
28d40 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
28d50 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65  tmtCksum = pPage
28d60 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
28d70 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  if( !pPager->stm
28d80 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  tOpen ){.    rc 
28d90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
28da0 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2d 3e 70  entemp(pPager->p
28db0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 73 74 66  Vfs, pPager->stf
28dc0 64 2c 20 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74  d, pPager->zStmt
28dd0 4a 72 6e 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  Jrnl,.          
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28df0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
28e00 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  SUBJOURNAL);.   
28e10 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
28e20 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
28e30 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
28e40 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
28e50 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
28e60 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
28e70 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
28e80 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
28e90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28ea0 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
28eb0 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
28ec0 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 29  Pager->pInStmt )
28ed0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
28ee0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
28ef0 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20  r->pInStmt);.   
28f00 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74   pPager->pInStmt
28f10 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
28f20 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
28f30 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67  ite3PagerStmtBeg
28f40 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
28f50 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  ){.  int rc;.  p
28f60 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
28f70 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53  );.  rc = pagerS
28f80 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29  tmtBegin(pPager)
28f90 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
28fa0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
28fb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
28fc0 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74  mmit a statement
28fd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28fe0 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
28ff0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
29000 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
29010 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
29020 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
29030 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c  .    PgHdr *pPg,
29040 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50 41 47   *pNext;.    PAG
29050 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43  ERTRACE2("STMT-C
29060 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
29070 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
29080 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
29090 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  .      /* sqlite
290a0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
290b0 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f  er->stfd, 0); */
290c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69  .      sqlite3Bi
290d0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
290e0 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20  er->pInStmt);.  
290f0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53      pPager->pInS
29100 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  tmt = 0;.    }el
29110 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  se{.      for(pP
29120 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
29130 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
29140 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
29150 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
29160 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
29170 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
29180 20 70 4e 65 78 74 20 3d 20 70 48 69 73 74 2d 3e   pNext = pHist->
29190 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20  pNextStmt;.     
291a0 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
291b0 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  ->inStmt );.    
291c0 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
291d0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
291e0 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Hist->pPrevStmt 
291f0 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
29200 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
29210 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69  sqlite3_free(pHi
29220 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
29230 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
29240 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
29250 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
29260 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
29270 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
29280 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
29290 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
292a0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
292b0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
292c0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
292d0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
292e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
292f0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74  ** Rollback a st
29300 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
29310 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
29320 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
29330 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
29340 63 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  c;.  pagerEnter(
29350 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
29360 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
29370 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
29380 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41  CE2("STMT-ROLLBA
29390 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
293a0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
293b0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
293c0 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
293d0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
293e0 70 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72  pHist;.      for
293f0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
29400 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48 69  mt; pPg; pPg=pHi
29410 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a  st->pNextStmt){.
29420 20 20 20 20 20 20 20 20 70 48 69 73 74 20 3d 20          pHist = 
29430 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
29440 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
29450 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
29460 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
29470 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
29480 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69  O_DATA(pPg), pHi
29490 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  st->pStmt, pPage
294a0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
294b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
294c0 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  free(pHist->pStm
294d0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48  t);.          pH
294e0 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
294f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29500 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
29510 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
29520 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20  >stmtSize;.     
29530 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
29540 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
29550 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29560 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
29570 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
29580 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
29590 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
295a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
295b0 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
295c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
295d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
295e0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
295f0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
29600 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
29610 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
29620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
29630 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
29640 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
29650 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
29660 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
29670 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61  PagerFilename(Pa
29680 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
29690 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
296a0 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
296b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46  ** Return the VF
296c0 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  S structure for 
296d0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f  the pager..*/.co
296e0 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20  nst sqlite3_vfs 
296f0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73  *sqlite3PagerVfs
29700 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
29710 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
29720 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pVfs;.}../*.**
29730 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   Return the file
29740 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
29750 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73  database file as
29760 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
29770 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
29780 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e  s might return N
29790 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20  ULL if the file 
297a0 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62  has.** not yet b
297b0 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73  een opened..*/.s
297c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c  qlite3_file *sql
297d0 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61  ite3PagerFile(Pa
297e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
297f0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66  return pPager->f
29800 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
29810 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  rn the directory
29820 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
29830 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
29840 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
29850 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20  erDirname(Pager 
29860 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
29870 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  rn pPager->zDire
29880 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ctory;.}../*.** 
29890 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
298a0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
298b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
298c0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
298d0 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
298e0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
298f0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
29900 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a  ager->zJournal;.
29910 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
29920 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20  true if fsync() 
29930 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c  calls are disabl
29940 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ed for this page
29950 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  r.  Return FALSE
29960 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20  .** if fsync()s 
29970 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72  are executed nor
29980 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mally..*/.int sq
29990 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
299a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
299b0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
299c0 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66  ->noSync;.}..#if
299d0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
299e0 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ODEC./*.** Set t
299f0 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
29a00 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20  s pager.*/.void 
29a10 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
29a20 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70  odec(.  Pager *p
29a30 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28  Pager,.  void *(
29a40 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
29a50 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a  oid*,Pgno,int),.
29a60 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
29a70 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  g.){.  pPager->x
29a80 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a  Codec = xCodec;.
29a90 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63    pPager->pCodec
29aa0 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b  Arg = pCodecArg;
29ab0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
29ac0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
29ad0 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
29ae0 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50  Move the page pP
29af0 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  g to location pg
29b00 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a  no in the file..
29b10 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
29b20 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
29b30 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72  s to the page pr
29b40 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64  eviously located
29b50 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69   at.** pgno (whi
29b60 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c  ch we call pPgOl
29b70 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70  d) though that p
29b80 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  age is allowed t
29b90 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65  o be.** in cache
29ba0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70  .  If the page p
29bb0 72 65 76 69 6f 75 73 20 6c 6f 63 61 74 65 64 20  revious located 
29bc0 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61  at pgno is not a
29bd0 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65  lready.** in the
29be0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
29bf0 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74  l, it is not put
29c00 20 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69   there by by thi
29c10 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
29c20 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   References to t
29c30 68 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61  he page pPg rema
29c40 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69  in valid. Updati
29c50 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64  ng any.** meta-d
29c60 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
29c70 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61  ith pPg (i.e. da
29c80 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
29c90 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
29ca0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
29cb0 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20   with the page) 
29cc0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
29cd0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
29ce0 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61  ler..**.** A tra
29cf0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
29d00 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69   active when thi
29d10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
29d20 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20  led. It used to 
29d30 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74  be.** required t
29d40 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hat a statement 
29d50 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
29d60 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20  not active, but 
29d70 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
29d80 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d  .** has been rem
29d90 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44  oved (CREATE IND
29da0 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65  EX needs to move
29db0 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73   a page when a s
29dc0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
29dd0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
29de0 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e)..*/.int sqlit
29df0 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
29e00 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44  Pager *pPager, D
29e10 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f  bPage *pPg, Pgno
29e20 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
29e30 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65  *pPgOld;  /* The
29e40 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72   page being over
29e50 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e  written. */.  in
29e60 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64  t h;.  Pgno need
29e70 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20  SyncPgno = 0;.. 
29e80 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
29e90 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  er);.  assert( p
29ea0 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
29eb0 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f   PAGERTRACE5("MO
29ec0 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
29ed0 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
29ee0 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
29ef0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
29f00 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
29f10 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67  Pg->needSync, pg
29f20 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  no);.  IOTRACE((
29f30 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e  "MOVE %p %d %d\n
29f40 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
29f50 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20  pgno, pgno))..  
29f60 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
29f70 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50  t(pPg);.  if( pP
29f80 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
29f90 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20     needSyncPgno 
29fa0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
29fb0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
29fc0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
29fd0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
29fe0 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
29ff0 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
2a000 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
2a010 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
2a020 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  c );.  }..  /* U
2a030 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69  nlink pPg from i
2a040 74 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f  ts hash-chain */
2a050 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  .  unlinkHashCha
2a060 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  in(pPager, pPg);
2a070 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
2a080 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  che contains a p
2a090 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75  age with page-nu
2a0a0 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76  mber pgno, remov
2a0b0 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69  e it.  ** from i
2a0c0 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  ts hash chain. A
2a0d0 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
2a0e0 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
2a0f0 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
2a100 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
2a110 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
2a120 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
2a130 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
2a140 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
2a150 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
2a160 0a 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  .  pPg->needSync
2a170 20 3d 20 30 3b 0a 20 20 70 50 67 4f 6c 64 20 3d   = 0;.  pPgOld =
2a180 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
2a190 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
2a1a0 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20  f( pPgOld ){.   
2a1b0 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d   assert( pPgOld-
2a1c0 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRef==0 );.    
2a1d0 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
2a1e0 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b  pPager, pPgOld);
2a1f0 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
2a200 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67 2d  PgOld);.    pPg-
2a210 3e 6e 65 65 64 53 79 6e 63 20 3d 20 70 50 67 4f  >needSync = pPgO
2a220 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 3b 0a 20 20  ld->needSync;.  
2a230 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e  }else{.    pPg->
2a240 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
2a250 7d 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  }.  pPg->inJourn
2a260 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
2a270 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
2a280 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
2a290 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74  ;..  /* Change t
2a2a0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
2a2b0 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72  or pPg and inser
2a2c0 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  t it into the ne
2a2d0 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f  w hash-chain. */
2a2e0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
2a2f0 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e  =0 );.  pPg->pgn
2a300 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
2a310 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
2a320 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20  nHash-1);.  if( 
2a330 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
2a340 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2a350 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
2a360 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
2a370 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
2a380 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
2a390 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  h = pPg;.  }.  p
2a3a0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
2a3b0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
2a3c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
2a3d0 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50  h[h] = pPg;.  pP
2a3e0 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
2a3f0 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  ;..  makeDirty(p
2a400 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
2a410 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a  irtyCache = 1;..
2a420 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
2a430 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
2a440 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
2a450 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
2a460 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2a470 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
2a480 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
2a490 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
2a4a0 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
2a4b0 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
2a4c0 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
2a4d0 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
2a4e0 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
2a4f0 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
2a500 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
2a510 20 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   ** Pager.pInJou
2a520 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65 65  rnal bit has bee
2a530 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
2a540 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
2a550 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20   by loading.    
2a560 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ** the page into
2a570 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
2a580 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
2a590 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
2a5a0 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
2a5b0 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d   ** If the attem
2a5c0 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70  pt to load the p
2a5d0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
2a5e0 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28  e-cache fails, (
2a5f0 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20  due.    ** to a 
2a600 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
2a610 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74  ailure), clear t
2a620 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49  he bit in the pI
2a630 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a  nJournal[].    *
2a640 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69  * array. Otherwi
2a650 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  se, if the page 
2a660 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72  is loaded and wr
2a670 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20  itten again in. 
2a680 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73     ** this trans
2a690 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62  action, it may b
2a6a0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
2a6b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
2a6c0 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20  efore.    ** it 
2a6d0 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  is synced into t
2a6e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2a6f0 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61   This way, it ma
2a700 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20  y end up in.    
2a710 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
2a720 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74  ile twice, but t
2a730 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  hat is not a pro
2a740 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  blem..    **.   
2a750 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
2a760 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
2a770 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
2a780 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
2a790 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
2a7a0 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
2a7b0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
2a7c0 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
2a7d0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48   int rc;.    PgH
2a7e0 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20  dr *pPgHdr;.    
2a7f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2a800 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
2a810 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2a820 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  rGet(pPager, nee
2a830 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48  dSyncPgno, &pPgH
2a840 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
2a850 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a860 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2a870 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  pInJournal && (i
2a880 6e 74 29 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c  nt)needSyncPgno<
2a890 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
2a8a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ize ){.        s
2a8b0 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61  qlite3BitvecClea
2a8c0 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  r(pPager->pInJou
2a8d0 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67  rnal, needSyncPg
2a8e0 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
2a8f0 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
2a900 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ager);.      ret
2a910 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2a920 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
2a930 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48  nc = 1;.    pPgH
2a940 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  dr->needSync = 1
2a950 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e  ;.    pPgHdr->in
2a960 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
2a970 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64   makeDirty(pPgHd
2a980 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  r);.    sqlite3P
2a990 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
2a9a0 29 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 4c  );.  }..  pagerL
2a9b0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
2a9c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a9d0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2a9e0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
2a9f0 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66  er to the data f
2aa00 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
2aa10 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
2aa20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
2aa30 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  ata(DbPage *pPg)
2aa40 7b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52  {.  return PGHDR
2aa50 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d  _TO_DATA(pPg);.}
2aa60 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
2aa70 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2aa80 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
2aa90 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70  es of "extra" sp
2aaa0 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ace .** allocate
2aab0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
2aac0 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
2aad0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
2aae0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44  3PagerGetExtra(D
2aaf0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
2ab00 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2ab10 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65  Pg->pPager;.  re
2ab20 74 75 72 6e 20 28 70 50 61 67 65 72 3f 50 47 48  turn (pPager?PGH
2ab30 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
2ab40 20 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a   pPager):0);.}..
2ab50 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
2ab60 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66  e locking-mode f
2ab70 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
2ab80 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
2ab90 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66  ust be one.** of
2aba0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2abb0 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f  DE_QUERY, PAGER_
2abc0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2abd0 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f  AL or .** PAGER_
2abe0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2abf0 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61  USIVE. If the pa
2ac00 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
2ac10 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74  QUERY, then.** t
2ac20 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
2ac30 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
2ac40 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  lue specified..*
2ac50 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
2ac60 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  d value is eithe
2ac70 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  r PAGER_LOCKINGM
2ac80 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a  ODE_NORMAL or.**
2ac90 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2aca0 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e  DE_EXCLUSIVE, in
2acb0 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72  dicating the cur
2acc0 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
2acd0 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69  pdated).** locki
2ace0 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  ng-mode..*/.int 
2acf0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
2ad00 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  ingMode(Pager *p
2ad10 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
2ad20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  ){.  assert( eMo
2ad30 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
2ad40 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20  GMODE_QUERY.    
2ad50 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
2ad60 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2ad70 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  ODE_NORMAL.     
2ad80 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
2ad90 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2ada0 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
2adb0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2adc0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
2add0 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Y<0 );.  assert(
2ade0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2adf0 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20  DE_NORMAL>=0 && 
2ae00 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2ae10 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29  E_EXCLUSIVE>=0 )
2ae20 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  ;.  if( eMode>=0
2ae30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
2ae40 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61  pFile ){.    pPa
2ae50 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2ae60 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a  de = eMode;.  }.
2ae70 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
2ae80 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2ae90 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ode;.}../*.** Ge
2aea0 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61  t/set the journa
2aeb0 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  l-mode for this 
2aec0 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
2aed0 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
2aee0 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4a  ne.** of PAGER_J
2aef0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
2af00 2c 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  , PAGER_JOURNALM
2af10 4f 44 45 5f 44 45 4c 45 54 45 20 6f 72 20 0a 2a  ODE_DELETE or .*
2af20 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
2af30 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 49 66 20  ODE_PERSIST. If 
2af40 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
2af50 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
2af60 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n.** the journal
2af70 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  -mode is set to 
2af80 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66  the value specif
2af90 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ied..**.** The r
2afa0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
2afb0 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4a 4f   either PAGER_JO
2afc0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
2afd0 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55   or.** PAGER_JOU
2afe0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
2aff0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
2b000 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
2b010 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6a  ly updated).** j
2b020 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ournal-mode..*/.
2b030 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2b040 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65  JournalMode(Page
2b050 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
2b060 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
2b070 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
2b080 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
2b090 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
2b0a0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2b0b0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20  NALMODE_DELETE. 
2b0c0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
2b0d0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2b0e0 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
2b0f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
2b100 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2b110 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20  ALMODE_OFF );.  
2b120 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f  assert( PAGER_JO
2b130 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c  URNALMODE_QUERY<
2b140 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  0 );.  assert( P
2b150 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2b160 5f 44 45 4c 45 54 45 3e 3d 30 20 26 26 20 50 41  _DELETE>=0 && PA
2b170 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2b180 50 45 52 53 49 53 54 3e 3d 30 20 29 3b 0a 20 20  PERSIST>=0 );.  
2b190 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a  if( eMode>=0 ){.
2b1a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2b1b0 6e 61 6c 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b  nalMode = eMode;
2b1c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
2b1d0 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  nt)pPager->journ
2b1e0 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 64 65  alMode;.}..#ifde
2b1f0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
2b200 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
2b210 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
2b220 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
2b230 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
2b240 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2b250 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61 67  PagerRefdump(Pag
2b260 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
2b270 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72  gHdr *pPg;.  for
2b280 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
2b290 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
2b2a0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
2b2b0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30  if( pPg->nRef<=0
2b2c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b2d0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2b2e0 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64  ntf("PAGE %3d ad
2b2f0 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22  dr=%p nRef=%d\n"
2b300 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70  , .       pPg->p
2b310 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
2b320 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
2b330 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
2b340 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  f..#endif /* SQL
2b350 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
2b360 2a 2f 0a                                         */.