/ Hex Artifact Content
Login

Artifact f5c2a4e85b632faa7cd891c214f1cfd021c1ffa9:


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 33 37  : pager.c,v 1.37
0350: 35 20 32 30 30 37 2f 30 38 2f 32 34 20 31 36 3a  5 2007/08/24 16:
0360: 30 38 3a 32 39 20 64 72 68 20 45 78 70 20 24 0a  08:29 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 27 73 20 61 72 67 75 6d 65 6e 74 2e 20 54  it's argument. T
0690: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
06a0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
06b0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49   is returned. FI
06c0: 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b  LEHANDLEID() tak
06d0: 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69  es an sqlite3_fi
06e0: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20  le.** struct as 
06f0: 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  it's argument..*
0700: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 49  /.#define PAGERI
0710: 44 28 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66  D(p) ((int)(p->f
0720: 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45  d)).#define FILE
0730: 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69  HANDLEID(fd) ((i
0740: 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  nt)fd)../*.** Th
0750: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
0760: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
0770: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0780: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0790: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  tes:.**.**   PAG
07a0: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20  ER_UNLOCK       
07b0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
07c0: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
07d0: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
0800: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0810: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    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 20 20 64 61 74 61 20 68 65 6c 64         data held
0840: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
0850: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
0860: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0870: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0880: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0890: 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68 65  HARED        The
08a0: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
08b0: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
08c0: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
08e0: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
08f0: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
0900: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
0920: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
0930: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
0940: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
0970: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0980: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
0990: 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72 6f  ED      This pro
09a0: 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76 65  cess has reserve
09b0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
09c0: 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20  or writing.**   
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20      but has not 
09f0: 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61  yet made any cha
0a00: 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20  nges.  Only one 
0a10: 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20  process.**      
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a30: 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72   at a time can r
0a40: 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61 62  eserve the datab
0a50: 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e  ase.  The origin
0a60: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0a80: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
0a90: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
0aa0: 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  so other.**     
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20    processes may 
0ad0: 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
0ae0: 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20   the on-disk.** 
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0b10: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ile..**.**   PAG
0b20: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20  ER_EXCLUSIVE    
0b30: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0b40: 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  is writing the d
0b50: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63 6c    Access is excl
0b80: 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72  usive.  No other
0b90: 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a   processes or.**
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20 63         threads c
0bc0: 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72  an be reading or
0bd0: 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f   writing while o
0be0: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ne.**           
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63              proc
0c00: 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a  ess is writing..
0c10: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59  **.**   PAGER_SY
0c20: 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65 20  NCED        The 
0c30: 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74  pager moves to t
0c40: 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50  his state from P
0c50: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a  AGER_EXCLUSIVE.*
0c60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0c70: 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c          after al
0c80: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61  l dirty pages ha
0c90: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
0ca0: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
0cd0: 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 62  d the file has b
0ce0: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a  een 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 20 20 64 69 73 6b 2e 20 41 6c 6c         disk. All
0d10: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f   that remains to
0d20: 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65   do is to remove
0d30: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 75               tru
0d50: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
0d60: 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74  l file and the t
0d70: 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20  ransaction .**  
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d       will be com
0da0: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
0db0: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0dc0: 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55  es up in PAGER_U
0dd0: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0de0: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0df0: 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f 63  te3PagerGet() oc
0e00: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
0e10: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0e20: 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20  AGER_SHARED..** 
0e30: 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20  After all pages 
0e40: 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73  have been releas
0e50: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f  ed using sqlite_
0e60: 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a  page_unref(),.**
0e70: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0e80: 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50  itions back to P
0e90: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0ea0: 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20  e first time.** 
0eb0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0ec0: 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
0ed0: 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  ed, the state tr
0ee0: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20  ansitions to.** 
0ef0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20  PAGER_RESERVED. 
0f00: 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69   (Note that sqli
0f10: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
0f20: 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63  can only be.** c
0f30: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73  alled on an outs
0f40: 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69  tanding page whi
0f50: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ch means that th
0f60: 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20  e pager must.** 
0f70: 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  be in PAGER_SHAR
0f80: 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72 61  ED before it tra
0f90: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0fa0: 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20  R_RESERVED.).** 
0fb0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d  PAGER_RESERVED m
0fc0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
0fd0: 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62  is an open rollb
0fe0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  ack journal..** 
0ff0: 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  The transition t
1000: 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  o PAGER_EXCLUSIV
1010: 45 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20  E occurs before 
1020: 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61  any changes.** a
1030: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
1040: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1050: 6f 75 67 68 20 77 72 69 74 65 73 20 74 6f 20 74  ough writes to t
1060: 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a  he rollback.** j
1070: 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69  ournal occurs wi
1080: 74 68 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45  th just PAGER_RE
1090: 53 45 52 56 45 44 2e 20 20 41 66 74 65 72 20 61  SERVED.  After a
10a0: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  n sqlite3PagerRo
10b0: 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73  llback().** or s
10c0: 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
10d0: 74 50 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65  tPhaseTwo(), the
10e0: 20 73 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61   state can go ba
10f0: 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
1100: 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e  ED,.** or it can
1110: 20 73 74 61 79 20 61 74 20 50 41 47 45 52 5f 45   stay at PAGER_E
1120: 58 43 4c 55 53 49 56 45 20 69 66 20 77 65 20 61  XCLUSIVE if we a
1130: 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  re in exclusive 
1140: 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a  access mode..*/.
1150: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e  #define PAGER_UN
1160: 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66  LOCK      0.#def
1170: 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45 44  ine PAGER_SHARED
1180: 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d        1   /* sam
1190: 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e as SHARED_LOCK
11a0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11b0: 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 20  R_RESERVED    2 
11c0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53    /* same as RES
11d0: 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  ERVED_LOCK */.#d
11e0: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c  efine PAGER_EXCL
11f0: 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73  USIVE   4   /* s
1200: 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56 45  ame as EXCLUSIVE
1210: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
1220: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1230: 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74     5../*.** If t
1240: 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  he SQLITE_BUSY_R
1250: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63  ESERVED_LOCK mac
1260: 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ro is set to tru
1270: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
1280: 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65  e,.** then faile
1290: 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65  d attempts to ge
12a0: 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
12b0: 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68  k will invoke th
12c0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e  e busy callback.
12d0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20  .** This is off 
12e0: 62 79 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20  by default.  To 
12f0: 73 65 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65  see why, conside
1300: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
1310: 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a  scenario:.** .**
1320: 20 53 75 70 70 6f 73 65 20 74 68 72 65 61 64 20   Suppose thread 
1330: 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
1340: 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
1350: 77 61 6e 74 73 20 61 20 72 65 73 65 72 76 65 64  wants a reserved
1360: 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64   lock..** Thread
1370: 20 42 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   B already has a
1380: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61   reserved lock a
1390: 6e 64 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c  nd wants an excl
13a0: 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a  usive lock.  If.
13b0: 2a 2a 20 62 6f 74 68 20 74 68 72 65 61 64 73 20  ** both threads 
13c0: 61 72 65 20 75 73 69 6e 67 20 74 68 65 69 72 20  are using their 
13d0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20  busy callbacks, 
13e0: 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f  it might be a lo
13f0: 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f  ng time.** be fo
1400: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72  r one of the thr
1410: 65 61 64 73 20 67 69 76 65 20 75 70 20 61 6e 64  eads give up and
1420: 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65   allows the othe
1430: 72 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a  r to proceed..**
1440: 20 42 75 74 20 69 66 20 74 68 65 20 74 68 72 65   But if the thre
1450: 61 64 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74  ad trying to get
1460: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f   the reserved lo
1470: 63 6b 20 67 69 76 65 73 20 75 70 20 71 75 69 63  ck gives up quic
1480: 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65  kly.** (if it ne
1490: 76 65 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20  ver invokes its 
14a0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74  busy callback) t
14b0: 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69  hen the contenti
14c0: 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65  on will be.** re
14d0: 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a  solved quickly..
14e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
14f0: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1500: 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51  LOCK.# define SQ
1510: 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
1520: 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66  ED_LOCK 0.#endif
1530: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
1540: 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73  ro rounds values
1550: 20 75 70 20 73 6f 20 74 68 61 74 20 69 66 20 74   up so that if t
1560: 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61  he value is an a
1570: 64 64 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20  ddress it.** is 
1580: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1590: 20 61 6e 20 61 64 64 72 65 73 73 20 74 68 61 74   an address that
15a0: 20 69 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61   is aligned to a
15b0: 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72  n 8-byte boundar
15c0: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f  y..*/.#define FO
15d0: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29  RCE_ALIGNMENT(X)
15e0: 20 20 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a     (((X)+7)&~7).
15f0: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d  ./*.** Each in-m
1600: 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 61  emory image of a
1610: 20 70 61 67 65 20 62 65 67 69 6e 73 20 77 69 74   page begins wit
1620: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
1630: 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20  header..** This 
1640: 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20 76  header is only v
1650: 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20 70  isible to this p
1660: 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68  ager module.  Th
1670: 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65  e client.** code
1680: 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67 65   that calls page
1690: 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65 20  r sees only the 
16a0: 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
16b0: 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  s the header..**
16c0: 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64 65 20  .** Client code 
16d0: 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69  should call sqli
16e0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
16f0: 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f 72 20  on a page prior 
1700: 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79  to making.** any
1710: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
1720: 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  o that page.  Th
1730: 65 20 66 69 72 73 74 20 74 69 6d 65 20 73 71 6c  e first time sql
1740: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1750: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  .** is called, t
1760: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
1770: 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 77 72   contents are wr
1780: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 72  itten into the r
1790: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e  ollback.** journ
17a0: 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a  al and PgHdr.inJ
17b0: 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72  ournal and PgHdr
17c0: 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20 73 65  .needSync are se
17d0: 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a  t.  Later, once.
17e0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70  ** the journal p
17f0: 61 67 65 20 68 61 73 20 6d 61 64 65 20 69 74 20  age has made it 
1800: 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75  onto the disk su
1810: 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e 65 65  rface, PgHdr.nee
1820: 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61  dSync.** is clea
1830: 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69 66 69  red.  The modifi
1840: 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62  ed page cannot b
1850: 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69  e written back i
1860: 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
1870: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
1880: 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72  e until the jour
1890: 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20 62 65  nal pages has be
18a0: 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  en synced to dis
18b0: 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48  k and the.** PgH
18c0: 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61 73 20  dr.needSync has 
18d0: 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a  been cleared..**
18e0: 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e 64 69  .** The PgHdr.di
18f0: 72 74 79 20 66 6c 61 67 20 69 73 20 73 65 74 20  rty flag is set 
1900: 77 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  when sqlite3Page
1910: 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
1920: 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65  ed and.** is cle
1930: 61 72 65 64 20 61 67 61 69 6e 20 77 68 65 6e 20  ared again when 
1940: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1950: 20 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b   is written back
1960: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
1970: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
1980: 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 74 61 69 6c 73  e..**.** Details
1990: 20 6f 66 20 69 6d 70 6f 72 74 61 6e 74 20 73 74   of important st
19a0: 72 75 63 74 75 72 65 20 65 6c 65 6d 65 6e 74 73  ructure elements
19b0: 3a 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63  :.**.** needSync
19c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
19d0: 69 73 20 69 73 20 74 72 75 65 2c 20 74 68 69 73  is is true, this
19e0: 20 6d 65 61 6e 73 20 74 68 61 74 20 69 74 20 69   means that it i
19f0: 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 77 72  s not safe to wr
1a00: 69 74 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  ite the page.** 
1a10: 20 20 20 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74      content to t
1a20: 68 65 20 64 61 74 61 62 61 73 65 20 62 65 63 61  he database beca
1a30: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  use the original
1a40: 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 65 64 0a   content needed.
1a50: 2a 2a 20 20 20 20 20 66 6f 72 20 72 6f 6c 6c 62  **     for rollb
1a60: 61 63 6b 20 68 61 73 20 6e 6f 74 20 62 79 20 73  ack has not by s
1a70: 79 6e 63 65 64 20 74 6f 20 74 68 65 20 6d 61 69  ynced to the mai
1a80: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
1a90: 61 6c 2e 0a 2a 2a 20 20 20 20 20 54 68 65 20 6f  al..**     The o
1aa0: 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20  riginal content 
1ab0: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72  may have been wr
1ac0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 72 6f 6c  itten to the rol
1ad0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  lback journal.**
1ae0: 20 20 20 20 20 62 75 74 20 69 74 20 68 61 73 20       but it has 
1af0: 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 73 79 6e  not yet been syn
1b00: 63 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e  ced.  So we cann
1b10: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
1b20: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
1b30: 66 69 6c 65 20 62 65 63 61 75 73 65 20 70 6f 77  file because pow
1b40: 65 72 20 66 61 69 6c 75 72 65 20 6d 69 67 68 74  er failure might
1b50: 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20   cause the page 
1b60: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
1b70: 69 6c 65 0a 2a 2a 20 20 20 20 20 74 6f 20 6e 65  ile.**     to ne
1b80: 76 65 72 20 72 65 61 63 68 20 74 68 65 20 64 69  ver reach the di
1b90: 73 6b 2e 20 20 49 74 20 69 73 20 61 73 20 69 66  sk.  It is as if
1ba0: 20 74 68 65 20 77 72 69 74 65 20 74 6f 20 74 68   the write to th
1bb0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
1bc0: 2a 20 20 20 20 20 64 6f 65 73 20 6e 6f 74 20 6f  *     does not o
1bd0: 63 63 75 72 20 75 6e 74 69 6c 20 74 68 65 20 6a  ccur until the j
1be0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
1bf0: 79 6e 63 65 64 2e 0a 2a 2a 20 20 20 20 20 0a 2a  ynced..**     .*
1c00: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
1c10: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
1c20: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 65 78 61  page content exa
1c30: 63 74 6c 79 20 6d 61 74 63 68 65 73 20 77 68 61  ctly matches wha
1c40: 74 0a 2a 2a 20 20 20 20 20 63 75 72 72 65 6e 74  t.**     current
1c50: 6c 79 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ly exists in the
1c60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1c70: 20 54 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c   The needSync fl
1c80: 61 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 20 20  ag is also.**   
1c90: 20 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 6f    false if the o
1ca0: 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20  riginal content 
1cb0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1cc0: 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   to the main rol
1cd0: 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 6a 6f 75  lback.**     jou
1ce0: 72 6e 61 6c 20 61 6e 64 20 73 79 6e 63 65 64 2e  rnal and synced.
1cf0: 20 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65    If the page re
1d00: 70 72 65 73 65 6e 74 73 20 61 20 6e 65 77 20 70  presents a new p
1d10: 61 67 65 20 74 68 61 74 20 68 61 73 0a 2a 2a 20  age that has.** 
1d20: 20 20 20 20 62 65 65 6e 20 61 64 64 65 64 20 6f      been added o
1d30: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
1d40: 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
1d50: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  ng the current.*
1d60: 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f  *     transactio
1d70: 6e 2c 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  n, the needSync 
1d80: 66 6c 61 67 20 69 73 20 74 72 75 65 20 75 6e 74  flag is true unt
1d90: 69 6c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  il the original 
1da0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
1db0: 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  size in the jour
1dc0: 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62  nal header has b
1dd0: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
1de0: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f 75 72  sk..**.** inJour
1df0: 6e 61 6c 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  nal.**.**     Th
1e00: 69 73 20 69 73 20 74 72 75 65 20 69 66 20 74 68  is is true if th
1e10: 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
1e20: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1e30: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a   into the main.*
1e40: 2a 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6a  *     rollback j
1e50: 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 69 73  ournal.  This is
1e60: 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 66 6f   always false fo
1e70: 72 20 6e 65 77 20 70 61 67 65 73 20 61 64 64 65  r new pages adde
1e80: 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  d to.**     the 
1e90: 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
1ea0: 61 73 65 20 66 69 6c 65 20 64 75 72 69 6e 67 20  ase file during 
1eb0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1ec0: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20 20 20  saction..**     
1ed0: 41 6e 64 20 74 68 69 73 20 66 6c 61 67 20 73 61  And this flag sa
1ee0: 79 73 20 6e 6f 74 68 69 6e 67 20 61 62 6f 75 74  ys nothing about
1ef0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1f00: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
1f10: 20 20 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63     has been sync
1f20: 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 46 6f 72  ed to disk.  For
1f30: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
1f40: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  in the original.
1f50: 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65 20  **     database 
1f60: 66 69 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  file, the follow
1f70: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ing expression s
1f80: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
1f90: 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  true:.**.**     
1fa0: 20 20 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70    inJournal = (p
1fb0: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1fc0: 6c 5b 28 70 67 6e 6f 2d 31 29 2f 38 5d 20 26 20  l[(pgno-1)/8] & 
1fd0: 28 31 3c 3c 28 28 70 67 6e 6f 2d 31 29 25 38 29  (1<<((pgno-1)%8)
1fe0: 29 21 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54  )!=0.**.**     T
1ff0: 68 65 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  he pPager->aInJo
2000: 75 72 6e 61 6c 5b 5d 20 61 72 72 61 79 20 69 73  urnal[] array is
2010: 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20   only valid for 
2020: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
2030: 20 20 20 20 70 61 67 65 73 20 6f 66 20 74 68 65      pages of the
2040: 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e   database, not n
2050: 65 77 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ew pages that ar
2060: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 65  e added to the e
2070: 6e 64 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  nd.**     of the
2080: 20 64 61 74 61 62 61 73 65 2c 20 73 6f 20 6f 62   database, so ob
2090: 76 69 6f 75 73 6c 79 20 74 68 65 20 61 62 6f 76  viously the abov
20a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e  e expression can
20b0: 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 76 61  not be.**     va
20c0: 6c 69 64 20 66 6f 72 20 6e 65 77 20 70 61 67 65  lid for new page
20d0: 73 2e 20 20 46 6f 72 20 6e 65 77 20 70 61 67 65  s.  For new page
20e0: 73 20 69 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61  s inJournal is a
20f0: 6c 77 61 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64  lways 0..**.** d
2100: 69 72 74 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57  irty.**.**     W
2110: 68 65 6e 20 74 72 75 65 2c 20 74 68 69 73 20 6d  hen true, this m
2120: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f  eans that the co
2130: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
2140: 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20  e has been.**   
2150: 20 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 6e    modified and n
2160: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
2170: 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  en back to the d
2180: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2190: 20 20 20 20 20 49 66 20 66 61 6c 73 65 2c 20 69       If false, i
21a0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74  t means that eit
21b0: 68 65 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  her the content 
21c0: 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a  of the page is.*
21d0: 2a 20 20 20 20 20 75 6e 63 68 61 6e 67 65 64 20  *     unchanged 
21e0: 6f 72 20 65 6c 73 65 20 74 68 65 20 63 6f 6e 74  or else the cont
21f0: 65 6e 74 20 69 73 20 75 6e 69 6d 70 6f 72 74 61  ent is unimporta
2200: 6e 74 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74  nt and we do not
2210: 0a 2a 2a 20 20 20 20 20 63 61 72 65 20 77 68 65  .**     care whe
2220: 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69  ther or not it i
2230: 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a  s preserved..**.
2240: 2a 2a 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ** alwaysRollbac
2250: 6b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73  k.**.**     This
2260: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
2270: 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
2280: 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 73  Rollback() API s
2290: 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20  hould be.**     
22a0: 69 67 6e 6f 72 65 64 20 66 6f 72 20 74 68 69 73  ignored for this
22b0: 20 70 61 67 65 2e 20 20 54 68 65 20 44 6f 6e 74   page.  The Dont
22c0: 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 61  Rollback() API a
22d0: 74 74 65 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a  ttempts to say.*
22e0: 2a 20 20 20 20 20 74 68 61 74 20 74 68 65 20 63  *     that the c
22f0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
2300: 67 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e  ge on disk is un
2310: 69 6d 70 6f 72 74 61 6e 74 20 28 69 74 20 69 73  important (it is
2320: 20 61 6e 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65   an.**     unuse
2330: 64 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72  d page on the fr
2340: 65 65 6c 69 73 74 29 20 73 6f 20 74 68 61 74 20  eelist) so that 
2350: 69 74 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72  it is unnecessar
2360: 79 20 74 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c  y to .**     rol
2370: 6c 62 61 63 6b 20 63 68 61 6e 67 65 73 20 74 6f  lback changes to
2380: 20 74 68 69 73 20 70 61 67 65 20 62 65 63 61 75   this page becau
2390: 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  se the content o
23a0: 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20  f the page.**   
23b0: 20 20 63 61 6e 20 63 68 61 6e 67 65 20 77 69 74    can change wit
23c0: 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
23d0: 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
23e0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
23f0: 0a 2a 2a 20 20 20 20 20 66 6c 61 67 20 6f 76 65  .**     flag ove
2400: 72 72 69 64 65 73 20 61 6e 79 20 44 6f 6e 74 52  rrides any DontR
2410: 6f 6c 6c 62 61 63 6b 28 29 20 61 74 74 65 6d 70  ollback() attemp
2420: 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20 69 73  t.  This flag is
2430: 20 73 65 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e   set.**     when
2440: 20 61 20 70 61 67 65 20 74 68 61 74 20 6f 72 69   a page that ori
2450: 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65  ginally containe
2460: 64 20 76 61 6c 69 64 20 64 61 74 61 20 69 73 20  d valid data is 
2470: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20  added to.**     
2480: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 4c  the freelist.  L
2490: 61 74 65 72 20 69 6e 20 74 68 65 20 73 61 6d 65  ater in the same
24a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
24b0: 69 73 20 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a  is page might.**
24c0: 20 20 20 20 20 62 65 20 70 75 6c 6c 65 64 20 66       be pulled f
24d0: 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
24e0: 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
24f0: 73 6f 6d 65 74 68 69 6e 67 20 64 69 66 66 65 72  something differ
2500: 65 6e 74 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61  ent.**     and a
2510: 74 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65  t that point the
2520: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2530: 41 50 49 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  API will be call
2540: 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20  ed because.**   
2550: 20 20 70 61 67 65 73 20 74 61 6b 65 6e 20 66 72    pages taken fr
2560: 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
2570: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
2580: 65 20 70 72 6f 74 65 63 74 65 64 20 62 79 0a 2a  e protected by.*
2590: 2a 20 20 20 20 20 74 68 65 20 72 6f 6c 6c 62 61  *     the rollba
25a0: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74  ck journal.  But
25b0: 20 74 68 69 73 20 66 6c 61 67 20 73 61 79 73 20   this flag says 
25c0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 77 61  that the page wa
25d0: 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69  s.**     not ori
25e0: 67 69 6e 61 6c 6c 79 20 70 61 72 74 20 6f 66 20  ginally part of 
25f0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20  the freelist so 
2600: 74 68 61 74 20 69 74 20 73 74 69 6c 6c 20 6e 65  that it still ne
2610: 65 64 73 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65  eds to.**     be
2620: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
2630: 73 70 69 74 65 20 6f 66 20 61 6e 79 20 73 75 62  spite of any sub
2640: 73 65 71 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c  sequent DontRoll
2650: 62 61 63 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a  back() calls..**
2660: 0a 2a 2a 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a  .** needRead .**
2670: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61  .**     This fla
2680: 67 20 6d 65 61 6e 73 20 28 77 68 65 6e 20 74 72  g means (when tr
2690: 75 65 29 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ue) that the con
26a0: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
26b0: 20 68 61 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20   has.**     not 
26c0: 79 65 74 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  yet been loaded 
26d0: 66 72 6f 6d 20 64 69 73 6b 2e 20 20 54 68 65 20  from disk.  The 
26e0: 69 6e 2d 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e  in-memory conten
26f0: 74 20 69 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20  t is just.**    
2700: 20 67 61 72 62 61 67 65 2e 20 20 28 41 63 74 75   garbage.  (Actu
2710: 61 6c 6c 79 2c 20 77 65 20 7a 65 72 6f 20 74 68  ally, we zero th
2720: 65 20 63 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79  e content, but y
2730: 6f 75 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a  ou should not.**
2740: 20 20 20 20 20 6d 61 6b 65 20 61 6e 79 20 61 73       make any as
2750: 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20  sumptions about 
2760: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65  the content neve
2770: 72 74 68 65 6c 65 73 73 2e 29 20 20 49 66 20 74  rtheless.)  If t
2780: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e  he.**     conten
2790: 74 20 69 73 20 6e 65 65 64 65 64 20 69 6e 20 74  t is needed in t
27a0: 68 65 20 66 75 74 75 72 65 2c 20 69 74 20 73 68  he future, it sh
27b0: 6f 75 6c 64 20 62 65 20 72 65 61 64 20 66 72 6f  ould be read fro
27c0: 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69  m the.**     ori
27d0: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
27e0: 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ile..*/.typedef 
27f0: 73 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48  struct PgHdr PgH
2800: 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48 64 72  dr;.struct PgHdr
2810: 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67   {.  Pager *pPag
2820: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2830: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
2840: 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 70   to which this p
2850: 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  age belongs */. 
2860: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
2890: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
28a0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
28b0: 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61  xtHash, *pPrevHa
28c0: 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c  sh;  /* Hash col
28d0: 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72  lision chain for
28e0: 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20   PgHdr.pgno */. 
28f0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65   PgHdr *pNextFre
2900: 65 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20  e, *pPrevFree;  
2910: 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70  /* Freelist of p
2920: 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d  ages where nRef=
2930: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
2940: 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20  NextAll;        
2950: 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74         /* A list
2960: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
2970: 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b  .  u8 inJournal;
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2990: 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73    /* TRUE if has
29a0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
29b0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
29c0: 20 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20   dirty;         
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 54 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20  TRUE if we need 
29f0: 74 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68  to write back ch
2a00: 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65  anges */.  u8 ne
2a10: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
2a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e            /* Syn
2a30: 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  c journal before
2a40: 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61   writing this pa
2a50: 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ge */.  u8 alway
2a60: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
2a70: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
2a80: 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  e DontRollback()
2a90: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
2aa0: 2f 0a 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b  /.  u8 needRead;
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65     /* Read conte
2ad0: 6e 74 20 69 66 20 50 61 67 65 72 57 72 69 74 65  nt if PagerWrite
2ae0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a  () is called */.
2af0: 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66    short int nRef
2b00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
2b20: 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  ers of this page
2b30: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69   */.  PgHdr *pDi
2b40: 72 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79  rty, *pPrevDirty
2b50: 3b 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61  ;    /* Dirty pa
2b60: 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 6f 74  ges */.  u32 not
2b70: 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  Used;           
2b80: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
2b90: 72 20 73 70 61 63 65 20 2a 2f 0a 23 69 66 64 65  r space */.#ifde
2ba0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
2bb0: 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65 48  AGES.  u32 pageH
2bc0: 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ash;.#endif.  /*
2bd0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2be0: 65 20 62 79 74 65 73 20 6f 66 20 70 61 67 65 20  e bytes of page 
2bf0: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73  data follow this
2c00: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20   header */.  /* 
2c10: 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
2c20: 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  es of local data
2c30: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65   follow the page
2c40: 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   data */.};../*.
2c50: 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ** For an in-mem
2c60: 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73  ory only databas
2c70: 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e  e, some extra in
2c80: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63  formation is rec
2c90: 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65  orded about.** e
2ca0: 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61 74  ach page so that
2cb0: 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20   changes can be 
2cc0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a  rolled back.  (J
2cd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
2ce0: 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72   not.** used for
2cf0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2d00: 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c  ases.)  The foll
2d10: 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  owing informatio
2d20: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a  n is added to.**
2d30: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
2d40: 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f  y EXTRA block fo
2d50: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
2d60: 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bases..**.** Thi
2d70: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f  s information co
2d80: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61 64  uld have been ad
2d90: 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ded directly to 
2da0: 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63 74  the PgHdr struct
2db0: 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e  ure..** But then
2dc0: 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75   it would take u
2dd0: 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79 74  p an extra 8 byt
2de0: 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e  es of storage on
2df0: 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20   every PgHdr.** 
2e00: 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61  even for disk-ba
2e10: 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20  sed databases.  
2e20: 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74  Splitting it out
2e30: 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e 20   saves 8 bytes. 
2e40: 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
2e50: 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e   a savings of 0.
2e60: 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65 72  8% but those per
2e70: 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e  centages add up.
2e80: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2e90: 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67 48  ct PgHistory PgH
2ea0: 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50  istory;.struct P
2eb0: 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20  gHistory {.  u8 
2ec0: 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f  *pOrig;     /* O
2ed0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78  riginal page tex
2ee0: 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74  t.  Restore to t
2ef0: 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f  his on a full ro
2f00: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a  llback */.  u8 *
2f10: 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65  pStmt;     /* Te
2f20: 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74 20  xt as it was at 
2f30: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2f40: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
2f50: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67 48 64  tement */.  PgHd
2f60: 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70  r *pNextStmt, *p
2f70: 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69  PrevStmt;  /* Li
2f80: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
2f90: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
2fa0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53  rnal */.  u8 inS
2fb0: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
2fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
2fd0: 20 69 66 20 69 6e 20 74 68 65 20 73 74 61 74 65   if in the state
2fe0: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
2ff0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d  */.};../*.** A m
3000: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
3010: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
3020: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
3030: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3040: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
3050: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
3060: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
3070: 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64  ec!=0 ){ P->xCod
3080: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
3090: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69  D,N,X); }.# defi
30a0: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
30b0: 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78  X) ((char*)(P->x
30c0: 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64  Codec!=0?P->xCod
30d0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
30e0: 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65  D,N,X):D)).#else
30f0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
3100: 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d  (P,D,N,X) /* NO-
3110: 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43  OP */.# define C
3120: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28  ODEC2(P,D,N,X) (
3130: 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66  (char*)D).#endif
3140: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
3150: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50  a pointer to a P
3160: 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e  gHdr into a poin
3170: 74 65 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a  ter to its data.
3180: 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69  ** and back agai
3190: 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47  n..*/.#define PG
31a0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20  HDR_TO_DATA(P)  
31b0: 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d  ((void*)(&(P)[1]
31c0: 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f  )).#define DATA_
31d0: 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26 28  TO_PGHDR(D)  (&(
31e0: 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d  (PgHdr*)(D))[-1]
31f0: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
3200: 54 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28  TO_EXTRA(G,P) ((
3210: 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29 28  void*)&((char*)(
3220: 26 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70  &(G)[1]))[(P)->p
3230: 61 67 65 53 69 7a 65 5d 29 0a 23 64 65 66 69 6e  ageSize]).#defin
3240: 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  e PGHDR_TO_HIST(
3250: 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20  P,PGR)  \.      
3260: 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f 72        ((PgHistor
3270: 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50  y*)&((char*)(&(P
3280: 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61  )[1]))[(PGR)->pa
3290: 67 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45  geSize+(PGR)->nE
32a0: 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  xtra])../*.** A 
32b0: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
32c0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
32d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
32e0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
32f0: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d   Pager.errCode m
3300: 61 79 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c  ay be set to SQL
3310: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
3320: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a  E_CORRUPT, or.**
3330: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e   or SQLITE_FULL.
3340: 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65   Once one of the
3350: 20 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72   first three err
3360: 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70  ors occurs, it p
3370: 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69  ersists.** and i
3380: 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74 68  s returned as th
3390: 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72  e result of ever
33a0: 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50  y major pager AP
33b0: 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20  I call.  The.** 
33c0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75  SQLITE_FULL retu
33d0: 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68  rn code is sligh
33e0: 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49  tly different. I
33f0: 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20  t persists only 
3400: 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78  until the.** nex
3410: 74 20 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c  t successful rol
3420: 6c 62 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d  lback is perform
3430: 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ed on the pager 
3440: 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20  cache. Also,.** 
3450: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73  SQLITE_FULL does
3460: 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20   not affect the 
3470: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
3480: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  ) and sqlite3Pag
3490: 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50  erLookup().** AP
34a0: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
34b0: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
34c0: 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75  ssfully..*/.stru
34d0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
34e0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
34f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
3500: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
3510: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 6a  for IO */.  u8 j
3520: 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20  ournalOpen;     
3530: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3540: 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
3550: 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76  descriptors is v
3560: 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  alid */.  u8 jou
3570: 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20  rnalStarted;    
3580: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3590: 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e   header of journ
35a0: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  al is synced */.
35b0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35d0: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
35e0: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
35f0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52  file */.  u8 noR
3600: 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  eadlock;        
3610: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
3620: 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e  bother to obtain
3630: 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20   readlocks */.  
3640: 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20  u8 stmtOpen;    
3650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3660: 72 75 65 20 69 66 20 74 68 65 20 73 74 61 74 65  rue if the state
3670: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
3680: 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20  is open */.  u8 
3690: 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20  stmtInUse;      
36a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
36b0: 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74 61   we are in a sta
36c0: 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
36d0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74  ction */.  u8 st
36e0: 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20  mtAutoopen;     
36f0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73         /* Open s
3700: 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  tmt journal when
3710: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
3720: 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e   opened*/.  u8 n
3730: 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  oSync;          
3740: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
3750: 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  t sync the journ
3760: 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  al if true */.  
3770: 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20  u8 fullSync;    
3780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3790: 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66  o extra syncs of
37a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
37b0: 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20   robustness */. 
37c0: 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20   u8 sync_flags; 
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37e0: 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d  One of SYNC_NORM
37f0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
3800: 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20  */.  u8 state;  
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   /* PAGER_UNLOCK
3830: 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45  , _SHARED, _RESE
3840: 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20  RVED, etc. */.  
3850: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
3860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
3870: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
3880: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
3890: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38b0: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
38c0: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
38d0: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73  /* True if an fs
3900: 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20  ync() is needed 
3910: 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  on the journal *
3920: 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61 63 68  /.  u8 dirtyCach
3930: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3940: 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
3950: 64 20 70 61 67 65 73 20 68 61 76 65 20 63 68 61  d pages have cha
3960: 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77  nged */.  u8 alw
3970: 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20  aysRollback;    
3980: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
3990: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
39a0: 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f  for all pages */
39b0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
39d0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
39e0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
39f0: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
3a00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a10: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
3a20: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
3a30: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
3a40: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63  /.  u8 doNotSync
3a50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a60: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c  /* Boolean. Whil
3a70: 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73  e true, do not s
3a80: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a  pill the cache *
3a90: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
3aa0: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
3ab0: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
3ac0: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
3ad0: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
3ae0: 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   u8 changeCountD
3af0: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  one;         /* 
3b00: 53 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d  Set after increm
3b10: 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  enting the chang
3b20: 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  e-counter */.  i
3b30: 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20  nt errCode;     
3b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
3b50: 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e  e of several kin
3b60: 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a  ds of errors */.
3b70: 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20    int dbSize;   
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b90: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3ba0: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   in the file */.
3bb0: 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65    int origDbSize
3bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3bd0: 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74   dbSize before t
3be0: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67  he current chang
3bf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53  e */.  int stmtS
3c00: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
3c10: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61     /* Size of da
3c20: 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65 73  tabase (in pages
3c30: 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28  ) at stmt_begin(
3c40: 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  ) */.  int nRec;
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3c70: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
3c80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
3c90: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3cb0: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
3cc0: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
3cd0: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
3ce0: 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20   int stmtNRec;  
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d00: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
3d10: 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75  s in stmt subjou
3d20: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rnal */.  int nE
3d30: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
3d40: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
3d50: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
3d60: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
3d70: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  age */.  int pag
3d80: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
3d90: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3da0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
3db0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
3dc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3dd0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
3de0: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
3df0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  pages */.  int n
3e00: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
3e10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3e20: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
3e30: 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e  ges with PgHdr.n
3e40: 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d  Ref>0 */.  int m
3e50: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
3e60: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
3e70: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  m number of page
3e80: 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63  s to hold in cac
3e90: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  he */.  Pgno mxP
3ea0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
3eb0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
3ec0: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
3ed0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
3ee0: 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b   u8 *aInJournal;
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f00: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
3f10: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
3f20: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
3f30: 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20  u8 *aInStmt;    
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3f50: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
3f60: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
3f70: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
3f80: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
3f90: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3fa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3fb0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
3fc0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
3fd0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3fe0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
3ff0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65  */.  char *zDire
4000: 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  ctory;          
4010: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f   /* Directory ho
4020: 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ld database and 
4030: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
4040: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4050: 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 2f  *fd, *jfd;     /
4060: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
4070: 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  rs for database 
4080: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  and journal */. 
4090: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73   sqlite3_file *s
40a0: 74 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  tfd;         /* 
40b0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
40c0: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
40d0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20  t subjournal*/. 
40e0: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
40f0: 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20  usyHandler;  /* 
4100: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
4110: 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f  e.busyHandler */
4120: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
4130: 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f  , *pLast;      /
4140: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70  * List of free p
4150: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
4160: 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20  *pFirstSynced;  
4170: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66        /* First f
4180: 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67  ree page with Pg
4190: 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Hdr.needSync==0 
41a0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c  */.  PgHdr *pAll
41b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
41c0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
41d0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
41e0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
41f0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
4200: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
4210: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
4220: 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  nal */.  PgHdr *
4230: 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20 20  pDirty;         
4240: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
4250: 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
4260: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
4270: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
4280: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
4290: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
42a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
42b0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
42d0: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
42e0: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
42f0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
4300: 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20  stmtHdrOff;     
4310: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
4320: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
4330: 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61  written this sta
4340: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20  tement */.  i64 
4350: 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20  stmtCksum;      
4360: 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d          /* cksum
4370: 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d  Init when statem
4380: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20  ent was started 
4390: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69  */.  i64 stmtJSi
43a0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
43b0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
43c0: 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69  nal at stmt_begi
43d0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63  n() */.  int sec
43e0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
43f0: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
4400: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
4410: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23  ng rollback */.#
4420: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4430: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
4440: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
4450: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
4460: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
4470: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
4480: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
4490: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
44a0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
44b0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  dif.  void (*xDe
44c0: 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67 65  structor)(DbPage
44d0: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
44e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
44f0: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
4500: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
4510: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c 69  niter)(DbPage*,i
4520: 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74  nt);   /* Call t
4530: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
4540: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
4550: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
4560: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
4570: 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
4580: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
4590: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
45a0: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
45b0: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
45c0: 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20  pCodecArg;      
45d0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
45e0: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
45f0: 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  c() */.#endif.  
4600: 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20  int nHash;      
4610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4620: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ize of the pager
4630: 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
4640: 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b 20   PgHdr **aHash; 
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4660: 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61  Hash table to ma
4670: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  p page number to
4680: 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65 66   PgHdr */.#ifdef
4690: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
46a0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
46b0: 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b  .  Pager *pNext;
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
46d0: 2a 20 44 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20  * Doubly linked 
46e0: 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 6f  list of pagers o
46f0: 6e 20 77 68 69 63 68 20 2a 2f 0a 20 20 50 61 67  n which */.  Pag
4700: 65 72 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20  er *pPrev;      
4710: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
4720: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
4730: 72 79 28 29 20 77 69 6c 6c 20 77 6f 72 6b 20 2a  ry() will work *
4740: 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73 65 4d 4d  /.  int iInUseMM
4750: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4760: 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 75  /* Non-zero if u
4770: 6e 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 4d 4d  navailable to MM
4780: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55 73 65   */.  int iInUse
4790: 44 42 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  DB;             
47a0: 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66    /* Non-zero if
47b0: 20 69 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c 65   in sqlite3_rele
47c0: 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f 0a  ase_memory() */.
47d0: 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70  #endif.  char *p
47e0: 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20  TmpSpace;       
47f0: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61       /* Pager.pa
4800: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
4810: 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73  space for tmp us
4820: 65 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69  e */.  char dbFi
4830: 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20  leVers[16];     
4840: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
4850: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
4860: 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  file changes */.
4870: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  };../*.** The fo
4880: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
4890: 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f  ariables hold co
48a0: 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a  unters used for.
48b0: 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  ** testing purpo
48c0: 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65  ses only.  These
48d0: 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f   variables do no
48e0: 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20  t exist in.** a 
48f0: 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c  non-testing buil
4900: 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  d.  These variab
4910: 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65  les are not thre
4920: 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64  ad-safe..*/.#ifd
4930: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
4940: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4950: 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20  _readdb_count = 
4960: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4970: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65  of full pages re
4980: 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e  ad from DB */.in
4990: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
49a0: 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20  writedb_count = 
49b0: 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
49c0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69  f full pages wri
49d0: 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e  tten to DB */.in
49e0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
49f0: 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30  writej_count = 0
4a00: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
4a10: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
4a20: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e  to journal */.in
4a30: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
4a40: 70 67 66 72 65 65 5f 63 6f 75 6e 74 20 3d 20 30  pgfree_count = 0
4a50: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
4a60: 66 20 63 61 63 68 65 20 70 61 67 65 73 20 66 72  f cache pages fr
4a70: 65 65 64 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  eed */.# define 
4a80: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
4a90: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
4aa0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
4ab0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
4ac0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
4ad0: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74  able points to t
4ae0: 68 65 20 68 65 61 64 20 6f 66 20 61 20 64 6f 75  he head of a dou
4af0: 62 6c 65 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 0a  ble-linked list.
4b00: 2a 2a 20 6f 66 20 61 6c 6c 20 70 61 67 65 72 73  ** of all pagers
4b10: 20 74 68 61 74 20 61 72 65 20 65 6c 69 67 69 62   that are eligib
4b20: 6c 65 20 66 6f 72 20 70 61 67 65 20 73 74 65 61  le for page stea
4b30: 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 73  ling by the.** s
4b40: 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
4b50: 65 6d 6f 72 79 28 29 20 69 6e 74 65 72 66 61 63  emory() interfac
4b60: 65 2e 20 20 41 63 63 65 73 73 20 74 6f 20 74 68  e.  Access to th
4b70: 69 73 20 6c 69 73 74 20 69 73 0a 2a 2a 20 70 72  is list is.** pr
4b80: 6f 74 65 63 74 65 64 20 62 79 20 74 68 65 20 53  otected by the S
4b90: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
4ba0: 49 43 5f 4d 45 4d 32 20 6d 75 74 65 78 2e 0a 2a  IC_MEM2 mutex..*
4bb0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4bc0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
4bd0: 4e 41 47 45 4d 45 4e 54 0a 73 74 61 74 69 63 20  NAGEMENT.static 
4be0: 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 50 61  Pager *sqlite3Pa
4bf0: 67 65 72 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  gerList = 0;.#en
4c00: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  dif.../*.** Jour
4c10: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
4c20: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
4c30: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
4c40: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
4c50: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
4c60: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
4c70: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
4c80: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
4c90: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
4ca0: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
4cb0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
4cc0: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
4cd0: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
4ce0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
4cf0: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
4d00: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
4d10: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69   journal is begi
4d20: 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  n.** written, se
4d30: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
4d40: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
4d50: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
4d60: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
4d70: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
4d80: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
4d90: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
4da0: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
4db0: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
4dc0: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
4dd0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
4de0: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
4df0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
4e00: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
4e10: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
4e20: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
4e30: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
4e40: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
4e50: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
4e60: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
4e70: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
4e80: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
4e90: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
4ea0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
4eb0: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
4ec0: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
4ed0: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
4ee0: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
4ef0: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
4f00: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
4f10: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
4f20: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
4f30: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
4f40: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
4f50: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
4f60: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
4f70: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
4f80: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
4f90: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
4fa0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
4fb0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
4fc0: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
4fd0: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
4fe0: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
4ff0: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
5000: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
5010: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
5020: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
5030: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
5040: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
5050: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
5060: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
5070: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
5080: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
5090: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
50a0: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
50b0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
50c0: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
50d0: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
50e0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
50f0: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
5100: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
5110: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
5120: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
5130: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
5140: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
5150: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
5160: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
5170: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
5180: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
5190: 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  f the header and
51a0: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e   of each page in
51b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
51c0: 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79  determined.** by
51d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
51e0: 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  acros..*/.#defin
51f0: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
5200: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
5210: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
5220: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
5230: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
5240: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
5250: 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   In the future, 
5260: 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  this could be.**
5270: 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c   set to some val
5280: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
5290: 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72   disk controller
52a0: 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a  . The important.
52b0: 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ** characteristi
52c0: 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20  c is that it is 
52d0: 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73  the same size as
52e0: 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a   a disk sector..
52f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
5300: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5310: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
5320: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
5330: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
5340: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
5350: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
5360: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5370: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
5380: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
5390: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
53a0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
53b0: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
53c0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
53d0: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
53e0: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
53f0: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
5400: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
5410: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
5420: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
5430: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
5440: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
5450: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
5460: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
5470: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
5480: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61  #endif../*.** Pa
5490: 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f  ge number PAGER_
54a0: 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72  MJ_PGNO is never
54b0: 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69   used in an SQLi
54c0: 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20  te database (it 
54d0: 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66  is.** reserved f
54e0: 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e  or working aroun
54f0: 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69  d a windows/posi
5500: 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74  x incompatibilit
5510: 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65  y). It is.** use
5520: 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
5530: 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74   to signify that
5540: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
5550: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
5560: 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65  le .** is devote
5570: 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d  d to storing a m
5580: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
5590: 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e  me - there are n
55a0: 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a  o more pages to.
55b0: 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65  ** roll back. Se
55c0: 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66  e comments for f
55d0: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73  unction writeMas
55e0: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
55f0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20   details..*/./* 
5600: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a  #define PAGER_MJ
5610: 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e  _PGNO(x) (PENDIN
5620: 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67  G_BYTE/((x)->pag
5630: 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69  eSize)) */.#defi
5640: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
5650: 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59  (x) ((PENDING_BY
5660: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
5670: 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  e))+1)../*.** Th
5680: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
5690: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
56a0: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
56b0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
56c0: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
56d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  ./*.** The pager
56e0: 45 6e 74 65 72 28 29 20 61 6e 64 20 70 61 67 65  Enter() and page
56f0: 72 4c 65 61 76 65 28 29 20 72 6f 75 74 69 6e 65  rLeave() routine
5700: 73 20 61 63 71 75 69 72 65 20 61 6e 64 20 72 65  s acquire and re
5710: 6c 65 61 73 65 0a 2a 2a 20 61 20 6d 75 74 65 78  lease.** a mutex
5720: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 72 2e 20   on each pager. 
5730: 20 54 68 65 20 6d 75 74 65 78 20 69 73 20 72 65   The mutex is re
5740: 63 75 72 73 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  cursive..**.** T
5750: 68 69 73 20 69 73 20 61 20 73 70 65 63 69 61 6c  his is a special
5760: 2d 70 75 72 70 6f 73 65 20 6d 75 74 65 78 2e 20  -purpose mutex. 
5770: 20 49 74 20 6f 6e 6c 79 20 70 72 6f 76 69 64 65   It only provide
5780: 73 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 69  s mutual exclusi
5790: 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68  on.** between th
57a0: 65 20 42 74 72 65 65 20 61 6e 64 20 74 68 65 20  e Btree and the 
57b0: 4d 65 6d 6f 72 79 20 4d 61 6e 61 67 65 6d 65 6e  Memory Managemen
57c0: 74 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73  t sqlite3_releas
57d0: 65 5f 6d 65 6d 6f 72 79 28 29 0a 2a 2a 20 66 75  e_memory().** fu
57e0: 6e 63 74 69 6f 6e 2e 20 20 49 74 20 64 6f 65 73  nction.  It does
57f0: 20 6e 6f 74 20 70 72 65 76 65 6e 74 2c 20 66 6f   not prevent, fo
5800: 72 20 65 78 61 6d 70 6c 65 2c 20 74 77 6f 20 42  r example, two B
5810: 74 72 65 65 73 20 66 72 6f 6d 20 61 63 63 65 73  trees from acces
5820: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 73 61 6d 65  sing.** the same
5830: 20 70 61 67 65 72 20 61 74 20 74 68 65 20 73 61   pager at the sa
5840: 6d 65 20 74 69 6d 65 2e 20 20 4f 74 68 65 72 20  me time.  Other 
5850: 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
5860: 6d 75 74 65 78 65 73 20 69 6e 0a 2a 2a 20 74 68  mutexes in.** th
5870: 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 68 61  e btree layer ha
5880: 6e 64 6c 65 20 74 68 61 74 20 63 68 6f 72 65 2e  ndle that chore.
5890: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
58a0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
58b0: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 73 74 61  MANAGEMENT.  sta
58c0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 45 6e  tic void pagerEn
58d0: 74 65 72 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ter(Pager *p){. 
58e0: 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 2b 2b     p->iInUseDB++
58f0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e  ;.    if( p->iIn
5900: 55 73 65 4d 4d 20 26 26 20 70 2d 3e 69 49 6e 55  UseMM && p->iInU
5910: 73 65 44 42 3d 3d 31 20 29 7b 0a 20 20 20 20 20  seDB==1 ){.     
5920: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
5930: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 6d 75 74  mutex;.      mut
5940: 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
5950: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
5960: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
5970: 32 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49 6e  2);.      p->iIn
5980: 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 20 20 20  UseDB = 0;.     
5990: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
59a0: 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20  nter(mutex);.   
59b0: 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d     p->iInUseDB =
59c0: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
59d0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
59e0: 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
59f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55 73  assert( p->iInUs
5a00: 65 4d 4d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  eMM==0 );.  }.  
5a10: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5a20: 72 4c 65 61 76 65 28 50 61 67 65 72 20 2a 70 29  rLeave(Pager *p)
5a30: 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44  {.    p->iInUseD
5a40: 42 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B--;.    assert(
5a50: 20 70 2d 3e 69 49 6e 55 73 65 44 42 3e 3d 30 20   p->iInUseDB>=0 
5a60: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64  );.  }.#else.# d
5a70: 65 66 69 6e 65 20 70 61 67 65 72 45 6e 74 65 72  efine pagerEnter
5a80: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 70 61 67  (X).# define pag
5a90: 65 72 4c 65 61 76 65 28 58 29 0a 23 65 6e 64 69  erLeave(X).#endi
5aa0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  f../*.** Enable 
5ab0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
5ac0: 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65  tracking (for de
5ad0: 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a  bugging) here:.*
5ae0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
5af0: 44 45 42 55 47 0a 20 20 69 6e 74 20 70 61 67 65  DEBUG.  int page
5b00: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
5b10: 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  e = 0;.  static 
5b20: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e  void pager_refin
5b30: 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20  fo(PgHdr *p){.  
5b40: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
5b50: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70   = 0;.    if( !p
5b60: 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e  ager3_refinfo_en
5b70: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
5b80: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
5b90: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52  rintf(.       "R
5ba0: 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d  EFCNT: %4d addr=
5bb0: 25 70 20 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74  %p nRef=%-3d tot
5bc0: 61 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  al=%d\n",.      
5bd0: 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f   p->pgno, PGHDR_
5be0: 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e  TO_DATA(p), p->n
5bf0: 52 65 66 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e  Ref, p->pPager->
5c00: 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  nRef.    );.    
5c10: 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65  cnt++;   /* Some
5c20: 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62  thing to set a b
5c30: 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a  reakpoint on */.
5c40: 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46    }.# define REF
5c50: 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72  INFO(X)  pager_r
5c60: 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a  efinfo(X).#else.
5c70: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
5c80: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
5c90: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
5ca0: 20 70 61 67 65 20 2a 70 50 67 20 68 61 73 20 61   page *pPg has a
5cb0: 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
5cc0: 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65  ten to the state
5cd0: 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ment.** journal 
5ce0: 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73 6e  (or statement sn
5cf0: 61 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e 20  apshot has been 
5d00: 63 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50 67  created, if *pPg
5d10: 20 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61   is part.** of a
5d20: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
5d30: 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
5d40: 20 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74 65   int pageInState
5d50: 6d 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29  ment(PgHdr *pPg)
5d60: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
5d70: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
5d80: 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
5d90: 20 20 20 20 72 65 74 75 72 6e 20 50 47 48 44 52      return PGHDR
5da0: 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
5db0: 61 67 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20  ager)->inStmt;. 
5dc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
5dd0: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
5de0: 6f 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70  o;.    u8 *a = p
5df0: 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3b 0a  Pager->aInStmt;.
5e00: 20 20 20 20 72 65 74 75 72 6e 20 28 61 20 26 26      return (a &&
5e10: 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
5e20: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 26 26 20  er->stmtSize && 
5e30: 28 61 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  (a[pgno/8] & (1<
5e40: 3c 28 70 67 6e 6f 26 37 29 29 29 29 3b 0a 20 20  <(pgno&7))));.  
5e50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
5e60: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
5e70: 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62  e pager hash tab
5e80: 6c 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74  le to N.  N must
5e90: 20 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f   be a power.** o
5ea0: 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  f two..*/.static
5eb0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69   void pager_resi
5ec0: 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61  ze_hash_table(Pa
5ed0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
5ee0: 20 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61   N){.  PgHdr **a
5ef0: 48 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73  Hash, *pPg;.  as
5f00: 73 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26  sert( N>0 && (N&
5f10: 28 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 70  (N-1))==0 );.  p
5f20: 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
5f30: 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71 6c  );.  aHash = sql
5f40: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
5f50: 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29  sizeof(aHash[0])
5f60: 2a 4e 20 29 3b 0a 20 20 70 61 67 65 72 45 6e 74  *N );.  pagerEnt
5f70: 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
5f80: 28 20 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ( aHash==0 ){.  
5f90: 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
5fa0: 72 65 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e  rehash is not an
5fb0: 20 65 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f   error.  It is o
5fc0: 6e 6c 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  nly a performanc
5fd0: 65 20 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65  e hit. */.    re
5fe0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
5ff0: 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
6000: 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65  >aHash);.  pPage
6010: 72 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20  r->nHash = N;.  
6020: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20  pPager->aHash = 
6030: 61 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 50 67  aHash;.  for(pPg
6040: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
6050: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
6060: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20  xtAll){.    int 
6070: 68 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  h;.    if( pPg->
6080: 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pgno==0 ){.     
6090: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
60a0: 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50  extHash==0 && pP
60b0: 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  g->pPrevHash==0 
60c0: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
60d0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 20 3d  e;.    }.    h =
60e0: 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d   pPg->pgno & (N-
60f0: 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  1);.    pPg->pNe
6100: 78 74 48 61 73 68 20 3d 20 61 48 61 73 68 5b 68  xtHash = aHash[h
6110: 5d 3b 0a 20 20 20 20 69 66 28 20 61 48 61 73 68  ];.    if( aHash
6120: 5b 68 5d 20 29 7b 0a 20 20 20 20 20 20 61 48 61  [h] ){.      aHa
6130: 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
6140: 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
6150: 20 20 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67    aHash[h] = pPg
6160: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
6170: 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Hash = 0;.  }.}.
6180: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
6190: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
61a0: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
61b0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
61c0: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
61d0: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
61e0: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
61f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
6200: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
6210: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
6220: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
6230: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
6240: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
6250: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
6260: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
6270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6280: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
6290: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
62a0: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
62b0: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
62c0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
62d0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
62e0: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
62f0: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
6300: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
6310: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
6320: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
6330: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
6340: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6350: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
6360: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
6370: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
6380: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
6390: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
63a0: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
63b0: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
63c0: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
63d0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
63e0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
63f0: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
6400: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
6410: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
6420: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
6430: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
6440: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
6450: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
6460: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
6470: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
6480: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
6490: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
64a0: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
64b0: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
64c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
64d0: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
64e0: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
64f0: 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73  * If file pFd is
6500: 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69   open, call sqli
6510: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e  te3OsUnlock() on
6520: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   it..*/.static i
6530: 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  nt osUnlock(sqli
6540: 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69  te3_file *pFd, i
6550: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28  nt eLock){.  if(
6560: 20 21 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20   !pFd->pMethods 
6570: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6580: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
6590: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55  eturn sqlite3OsU
65a0: 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b  nlock(pFd, eLock
65b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
65c0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
65d0: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
65e0: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
65f0: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
6600: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  n.** can be used
6610: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72   with this pager
6620: 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  . The optimizati
6630: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
6640: 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68  f:.**.**  (a) th
6650: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
6660: 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72   by OsDeviceChar
6670: 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e  acteristics() in
6680: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
6690: 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20       a database 
66a0: 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74  page may be writ
66b0: 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20  ten atomically, 
66c0: 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20  and.**  (b) the 
66d0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
66e0: 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  y OsSectorSize()
66f0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
6700: 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74   equal.**      t
6710: 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  o the page size.
6720: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  .**.** If the op
6730: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f  timization canno
6740: 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20  t be used, 0 is 
6750: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
6760: 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20  can be used,.** 
6770: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
6780: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73  eturned is the s
6790: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
67a0: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a  al file when it.
67b0: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c  ** contains roll
67c0: 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78  back data for ex
67d0: 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a  actly one page..
67e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
67f0: 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
6800: 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20  RITE.static int 
6810: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50  jrnlBufferSize(P
6820: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
6830: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
6840: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
6850: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
6860: 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20    int nSector;  
6870: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
6880: 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  ze */.  int nPag
6890: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  e;        /* Pag
68a0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69  e size */.  sqli
68b0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70  te3_file *fd = p
68c0: 50 61 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66  Pager->fd;..  if
68d0: 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
68e0: 7b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74  {.    dc = sqlit
68f0: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
6900: 74 65 72 69 73 74 69 63 73 28 66 64 29 3b 0a 20  teristics(fd);. 
6910: 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c     nSector = sql
6920: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
6930: 28 66 64 29 3b 0a 20 20 20 20 6e 50 61 67 65 20  (fd);.    nPage 
6940: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
6950: 7a 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ze;.  }..  asser
6960: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
6970: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
6980: 38 29 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51  8));.  assert(SQ
6990: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
69a0: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
69b0: 29 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70  );..  if( !fd->p
69c0: 4d 65 74 68 6f 64 73 20 7c 7c 20 28 64 63 26 28  Methods || (dc&(
69d0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
69e0: 4d 49 43 7c 28 6e 50 61 67 65 3e 3e 38 29 29 26  MIC|(nPage>>8))&
69f0: 26 6e 53 65 63 74 6f 72 3c 3d 6e 50 61 67 65 29  &nSector<=nPage)
6a00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4a   ){.    return J
6a10: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6a20: 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
6a30: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
6a40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
6a50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
6a60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
6a70: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
6a80: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  en an error occu
6a90: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  rs within the pa
6aa0: 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65  ger.** code. The
6ab0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
6ac0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
6ad0: 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
6ae0: 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ure, the.** seco
6af0: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
6b00: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
6b10: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
6b20: 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
6b30: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
6b40: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
6b50: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
6b60: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
6b70: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
6b80: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
6b90: 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
6ba0: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
6bb0: 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49  CORRUPT, or SQLI
6bc0: 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65  TE_FULL.** the e
6bd0: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
6be0: 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62  sistent. All sub
6bf0: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
6c00: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a  s on this Pager.
6c10: 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  ** will immediat
6c20: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
6c30: 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ame error code..
6c40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
6c50: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
6c60: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
6c70: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
6c80: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
6c90: 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
6ca0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
6cb0: 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
6cc0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
6cd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
6ce0: 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
6cf0: 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
6d00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
6d10: 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d  ;.  if(.    rc2=
6d20: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
6d30: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
6d40: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32  IOERR ||.    rc2
6d50: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
6d60: 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
6d70: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
6d80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  .}../*.** If SQL
6da0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
6db0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
6dc0: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
6dd0: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
6de0: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
6df0: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
6e00: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
6e10: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
6e20: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
6e30: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
6e40: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
6e50: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
6e60: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
6e70: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
6e80: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
6e90: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
6ea0: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
6eb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
6ec0: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
6ed0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
6ee0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
6ef0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
6f00: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
6f10: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
6f20: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
6f30: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
6f40: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
6f50: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
6f60: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
6f70: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
6f80: 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20 20 20 20  >pageSize, .    
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fa0: 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20 63 68      (unsigned ch
6fb0: 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  ar *)PGHDR_TO_DA
6fc0: 54 41 28 70 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f  TA(pPage));.}../
6fd0: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
6fe0: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
6ff0: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
7000: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
7010: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
7020: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
7030: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
7040: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
7050: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
7060: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
7070: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
7080: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
7090: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
70a0: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
70b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
70c0: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
70d0: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
70e0: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
70f0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
7100: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
7110: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
7120: 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61  rt( !pPg->pageHa
7130: 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  sh || pPager->er
7140: 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c  rCode || MEMDB |
7150: 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20  | pPg->dirty || 
7160: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
7170: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
7180: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
7190: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
71a0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
71b0: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
71c0: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
71d0: 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  0.#define CHECK_
71e0: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a  PAGE(x).#endif..
71f0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
7200: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
7210: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
7220: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
7230: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65   be open..** The
7240: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7250: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61  file name is rea
7260: 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f  d from the end o
7270: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a  f the file and .
7280: 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
7290: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
72a0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
72b0: 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72  loc(). *pzMaster
72c0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f   is.** set to po
72d0: 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72  int at the memor
72e0: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  y and SQLITE_OK 
72f0: 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
7300: 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c  ller must.** sql
7310: 69 74 65 33 5f 66 72 65 65 28 29 20 2a 70 7a 4d  ite3_free() *pzM
7320: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
7330: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
7340: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
7350: 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72  resent *pzMaster
7360: 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
7370: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
7380: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
7390: 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72  c int readMaster
73a0: 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f  Journal(sqlite3_
73b0: 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61  file *pJrnl, cha
73c0: 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20  r **pzMaster){. 
73d0: 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c   int rc;.  u32 l
73e0: 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20  en;.  i64 szJ;. 
73f0: 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e   u32 cksum;.  in
7400: 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
7410: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
7420: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
7430: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
7440: 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61  ader */..  *pzMa
7450: 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20  ster = 0;..  rc 
7460: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
7470: 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29  ize(pJrnl, &szJ)
7480: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7490: 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20  TE_OK || szJ<16 
74a0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
74b0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
74c0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
74d0: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
74e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
74f0: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
7500: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
7510: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
7520: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7530: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
7540: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
7550: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
7560: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
7570: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7580: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
7590: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
75a0: 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74  lMagic, 8) ) ret
75b0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61  urn rc;..  *pzMa
75c0: 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73  ster = (char *)s
75d0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
75e0: 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21  (len+1);.  if( !
75f0: 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  *pzMaster ){.   
7600: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
7610: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  OMEM;.  }.  rc =
7620: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
7630: 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c  Jrnl, *pzMaster,
7640: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
7650: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7660: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
7670: 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 7a 4d 61  lite3_free(*pzMa
7680: 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61  ster);.    *pzMa
7690: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65  ster = 0;.    re
76a0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
76b0: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
76c0: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
76d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
76e0: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
76f0: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
7700: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28  {.    cksum -= (
7710: 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20  *pzMaster)[i];. 
7720: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
7730: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
7740: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
7750: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
7760: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
7770: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
7780: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
7790: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
77a0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
77b0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
77c0: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
77d0: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
77e0: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
77f0: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
7800: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
7810: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
7820: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
7830: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
7840: 5f 66 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29  _free(*pzMaster)
7850: 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20  ;.    *pzMaster 
7860: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
7870: 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65    (*pzMaster)[le
7880: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  n] = '\0';.  }. 
7890: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
78a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
78b0: 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Seek the journal
78c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
78d0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
78e0: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65  tor boundary whe
78f0: 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  re a.** journal 
7900: 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65  header may be re
7910: 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50  ad or written. P
7920: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
7930: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a  is updated with.
7940: 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20  ** the new seek 
7950: 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e  offset..**.** i.
7960: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
7970: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
7980: 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20  * Input Offset  
7990: 20 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70              Outp
79a0: 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d  ut Offset.** ---
79b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
79d0: 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20  ----.** 0       
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79f0: 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20    0.** 512      
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a10: 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20   512.** 100     
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a30: 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20    512.** 2000   
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
7a60: 74 61 74 69 63 20 76 6f 69 64 20 73 65 65 6b 4a  tatic void seekJ
7a70: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
7a80: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
7a90: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
7aa0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
7ab0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
7ac0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
7ad0: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
7ae0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
7af0: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
7b00: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
7b10: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
7b20: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
7b30: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
7b40: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
7b50: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
7b60: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
7b70: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7b80: 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  er) );.  pPager-
7b90: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66  >journalOff = of
7ba0: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
7bb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7bc0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
7bd0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
7be0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
7bf0: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
7c00: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
7c10: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
7c20: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
7c30: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
7c40: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
7c50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
7c60: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
7c70: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
7c80: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
7c90: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
7ca0: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
7cb0: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
7cc0: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
7cd0: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
7ce0: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
7cf0: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
7d00: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
7d10: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
7d20: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
7d30: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
7d40: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
7d50: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
7d60: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
7d70: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
7d80: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
7d90: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
7da0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
7db0: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
7dc0: 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20  _SZ - 24) bytes 
7dd0: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
7de0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
7df0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
7e00: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
7e10: 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69   char zHeader[si
7e20: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7e30: 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e 74 20 72  ic)+16];.  int r
7e40: 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
7e50: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20  ->stmtHdrOff==0 
7e60: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
7e70: 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67  tmtHdrOff = pPag
7e80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
7e90: 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e    }..  seekJourn
7ea0: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
7eb0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7ec0: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
7ed0: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d  urnalOff;..  mem
7ee0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
7ef0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
7f00: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7f10: 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  ));..  /* .  ** 
7f20: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
7f30: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
7f40: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
7f50: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
7f60: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
7f70: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
7f80: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
7f90: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
7fa0: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
7fb0: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
7fc0: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
7fd0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
7fe0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
7ff0: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
8000: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
8010: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
8020: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
8030: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
8040: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
8050: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
8060: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
8070: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
8080: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
8090: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
80a0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
80b0: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
80c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
80d0: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
80e0: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
80f0: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
8100: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
8110: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
8120: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
8130: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
8140: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
8150: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
8160: 69 6c 75 72 65 20 6f 63 63 75 72 65 64 20 77 68  ilure occured wh
8170: 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20  ilst writing to 
8180: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
8190: 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e   file it may con
81a0: 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67  tain some garbag
81b0: 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72  e data. There ar
81c0: 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a  e two scenarios.
81d0: 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20    ** where this 
81e0: 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f  risk can be igno
81f0: 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  red:.  **.  **  
8200: 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65   * When the page
8210: 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  r is in no-sync 
8220: 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e  mode. Corruption
8230: 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20   can follow a.  
8240: 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69  **     power fai
8250: 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73  lure in this cas
8260: 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20  e anyway..  **. 
8270: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
8280: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
8290: 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69  FE_APPEND flag i
82a0: 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72  s set. This guar
82b0: 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20  antees.  **     
82c0: 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74  that garbage dat
82d0: 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e  a is never appen
82e0: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
82f0: 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  al file..  */.  
8300: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
8310: 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
8320: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20  ger->noSync);.  
8330: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  if( (pPager->noS
8340: 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28 73 71 6c  ync) .   || (sql
8350: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
8360: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
8370: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
8380: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
8390: 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75 74 33  ) .  ){.    put3
83a0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
83b0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
83c0: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
83d0: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
83e0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
83f0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
8400: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a  nalMagic)], 0);.
8410: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
8420: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
8430: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
8440: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
8450: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
8460: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
8470: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
8480: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
8490: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
84a0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
84b0: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
84c0: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
84d0: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
84e0: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
84f0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
8500: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
8510: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
8520: 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  dbSize);.  /* Th
8530: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
8540: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
8550: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
8560: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
8570: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
8580: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
8590: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
85a0: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
85b0: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
85c0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
85d0: 6f 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f  ournalHdr, sizeo
85e0: 66 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72  f(zHeader))).  r
85f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
8600: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
8610: 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  zHeader, sizeof(
8620: 7a 48 65 61 64 65 72 29 2c 70 50 61 67 65 72 2d  zHeader),pPager-
8630: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
8640: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8650: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
8660: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20  R_SZ(pPager);.. 
8670: 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
8680: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
8690: 77 72 69 74 74 65 6e 20 73 75 63 63 65 73 73 66  written successf
86a0: 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a  ully. Seek the j
86b0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
86c0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
86d0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
86e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
86f0: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tor..  */.  if( 
8700: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8710: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
8720: 54 41 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  TAIL %p %lld\n",
8730: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
8740: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a  >journalOff-1)).
8750: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8760: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
8770: 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 2c 20  jfd, "\000", 1, 
8780: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8790: 66 66 2d 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ff-1);.  }.  ret
87a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
87b0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
87c0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
87d0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
87e0: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
87f0: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
8800: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
8810: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
8820: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
8830: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
8840: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65  rnal.** file. Se
8850: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
8860: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
8870: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20  ournalHdr() for 
8880: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
8890: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
88a0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
88b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
88c0: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
88d0: 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69  ssfully, *nRec i
88e0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
88f0: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
8900: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
8910: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
8920: 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20   *dbSize is set 
8930: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
8940: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
8950: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
8960: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
8970: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
8980: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
8990: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
89a0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
89b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
89c0: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
89d0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
89e0: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
89f0: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
8a00: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
8a10: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
8a20: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
8a30: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
8a40: 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64  and *nRec and *d
8a50: 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65  bSize are not se
8a60: 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  t.  If JOURNAL_H
8a70: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
8a80: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
8a90: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
8aa0: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
8ab0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
8ac0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
8ad0: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
8ae0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
8af0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
8b00: 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  ,.  u32 *pNRec, 
8b10: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a  .  u32 *pDbSize.
8b20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
8b30: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
8b40: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
8b50: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
8b60: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
8b70: 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 0a    i64 jrnlOff;..
8b80: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
8b90: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
8ba0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8bb0: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
8bc0: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
8bd0: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
8be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
8bf0: 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66  E;.  }.  jrnlOff
8c00: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
8c10: 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73  alOff;..  rc = s
8c20: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
8c30: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
8c40: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
8c50: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66  , jrnlOff);.  if
8c60: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
8c70: 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73  ;.  jrnlOff += s
8c80: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a  izeof(aMagic);..
8c90: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
8ca0: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
8cb0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
8cc0: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  c))!=0 ){.    re
8cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8ce0: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65  ;.  }..  rc = re
8cf0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
8d00: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70  >jfd, jrnlOff, p
8d10: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
8d20: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
8d30: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
8d40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
8d50: 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d  lOff+4, &pPager-
8d60: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69  >cksumInit);.  i
8d70: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
8d80: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
8d90: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
8da0: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44  d, jrnlOff+8, pD
8db0: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
8dc0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8dd0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
8de0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
8df0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
8e00: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
8e10: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
8e20: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
8e30: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
8e40: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
8e50: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
8e60: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
8e70: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
8e80: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
8e90: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
8ea0: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
8eb0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
8ec0: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
8ed0: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
8ee0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
8ef0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
8f00: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
8f10: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
8f20: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
8f30: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
8f40: 31 32 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67  12, (u32 *)&pPag
8f50: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
8f60: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
8f70: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
8f80: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
8f90: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8fa0: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
8fb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
8fc0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
8fd0: 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
8fe0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
8ff0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
9000: 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
9010: 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
9020: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
9030: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
9040: 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
9050: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
9060: 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
9070: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
9080: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
9090: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
90a0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
90b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
90c0: 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
90d0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
90e0: 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
90f0: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
9100: 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
9110: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62   is:.**.** + 4 b
9120: 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50  ytes: PAGER_MJ_P
9130: 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65  GNO..** + N byte
9140: 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  s: length of mas
9150: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
9160: 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  ..** + 4 bytes: 
9170: 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  N.** + 4 bytes: 
9180: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
9190: 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
91a0: 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
91b0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
91c0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
91d0: 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
91e0: 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
91f0: 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
9200: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
9210: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  rnal name..**.**
9220: 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
9230: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
9240: 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
9250: 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
9260: 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
9270: 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
9280: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
9290: 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
92a0: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
92b0: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
92c0: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
92d0: 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a  rc;.  int len; .
92e0: 20 20 69 6e 74 20 69 3b 20 0a 20 20 69 36 34 20    int i; .  i64 
92f0: 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75 33 32 20 63  jrnlOff;.  u32 c
9300: 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72  ksum = 0;.  char
9310: 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f   zBuf[sizeof(aJo
9320: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d  urnalMagic)+2*4]
9330: 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
9340: 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74  r || pPager->set
9350: 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53  Master) return S
9360: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
9370: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
9380: 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  1;..  len = strl
9390: 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66  en(zMaster);.  f
93a0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69  or(i=0; i<len; i
93b0: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
93c0: 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20  = zMaster[i];.  
93d0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
93e0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
93f0: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
9400: 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
9410: 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
9420: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
9430: 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
9440: 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
9450: 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
9460: 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
9470: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
9480: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
9490: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
94a0: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
94b0: 0a 20 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  .    seekJournal
94c0: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Hdr(pPager);.  }
94d0: 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61  .  jrnlOff = pPa
94e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
94f0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
9500: 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30  alOff += (len+20
9510: 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  );..  rc = write
9520: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9530: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47  fd, jrnlOff, PAG
9540: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
9550: 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  r));.  if( rc!=S
9560: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
9570: 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  n rc;.  jrnlOff 
9580: 2b 3d 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71  += 4;..  rc = sq
9590: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
95a0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
95b0: 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29  r, len, jrnlOff)
95c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
95d0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
95e0: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
95f0: 6c 65 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69 74  len;..  put32bit
9600: 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  s(zBuf, len);.  
9610: 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b  put32bits(&zBuf[
9620: 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65  4], cksum);.  me
9630: 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61  mcpy(&zBuf[8], a
9640: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
9650: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
9660: 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ic));.  rc = sql
9670: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
9680: 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38  er->jfd, zBuf, 8
9690: 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  +sizeof(aJournal
96a0: 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29  Magic), jrnlOff)
96b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
96c0: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
96d0: 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e  noSync;.  return
96e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
96f0: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61  d or remove a pa
9700: 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  ge from the list
9710: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68   of all pages th
9720: 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a  at are in the.**
9730: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
9740: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61  al..**.** The Pa
9750: 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61  ger keeps a sepa
9760: 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67  rate list of pag
9770: 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  es that are curr
9780: 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20  ently in.** the 
9790: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
97a0: 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  l.  This helps t
97b0: 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  he sqlite3PagerS
97c0: 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72  tmtCommit().** r
97d0: 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20  outine run MUCH 
97e0: 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63  faster for the c
97f0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
9800: 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a   there are many.
9810: 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f  ** pages in memo
9820: 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65  ry but only a fe
9830: 77 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  w are in the sta
9840: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
9850: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
9860: 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
9870: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
9880: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
9890: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
98a0: 0a 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48  .  PgHistory *pH
98b0: 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
98c0: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
98d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44  ;.  assert( MEMD
98e0: 42 20 29 3b 0a 20 20 69 66 28 20 21 70 48 69 73  B );.  if( !pHis
98f0: 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20  t->inStmt ){.   
9900: 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
9910: 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20  pPrevStmt==0 && 
9920: 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
9930: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
9940: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a  Pager->pStmt ){.
9950: 20 20 20 20 20 20 50 47 48 44 52 5f 54 4f 5f 48        PGHDR_TO_H
9960: 49 53 54 28 70 50 61 67 65 72 2d 3e 70 53 74 6d  IST(pPager->pStm
9970: 74 2c 20 70 50 61 67 65 72 29 2d 3e 70 50 72 65  t, pPager)->pPre
9980: 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20  vStmt = pPg;.   
9990: 20 7d 0a 20 20 20 20 70 48 69 73 74 2d 3e 70 4e   }.    pHist->pN
99a0: 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72  extStmt = pPager
99b0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 61  ->pStmt;.    pPa
99c0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
99d0: 3b 0a 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53  ;.    pHist->inS
99e0: 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  tmt = 1;.  }.}..
99f0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
9a00: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
9a10: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
9a20: 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ge number.  Retu
9a30: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
9a40: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
9a50: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
9a60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
9a70: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
9a80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
9a90: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
9aa0: 64 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61  dr *p;.  if( pPa
9ab0: 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20  ger->aHash==0 ) 
9ac0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20  return 0;.  p = 
9ad0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67  pPager->aHash[pg
9ae0: 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
9af0: 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65  ash-1)];.  while
9b00: 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d  ( p && p->pgno!=
9b10: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20  pgno ){.    p = 
9b20: 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  p->pNextHash;.  
9b30: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
9b40: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
9b50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9b70: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
9b80: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
9b90: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
9ba0: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
9bb0: 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
9bc0: 20 20 20 20 20 6f 73 55 6e 6c 6f 63 6b 28 70 50       osUnlock(pP
9bd0: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
9be0: 4b 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  K);.      pPager
9bf0: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
9c00: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55       IOTRACE(("U
9c10: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
9c20: 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 20 20  ger)).    }.    
9c30: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
9c40: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
9c50: 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
9c60: 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
9c70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63   }.}../*.** Exec
9c80: 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
9c90: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
9ca0: 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
9cb0: 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
9cc0: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
9cd0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
9ce0: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
9cf0: 65 61 64 79 20 65 6e 74 65 72 65 64 0a 2a 2a 20  eady entered.** 
9d00: 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 2e  the error-state.
9d10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9d20: 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
9d30: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29  llback(Pager *p)
9d40: 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f  {.  if( p->errCo
9d50: 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  de ) return;.  a
9d60: 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e  ssert( p->state>
9d70: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
9d80: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  || p->journalOpe
9d90: 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  n==0 );.  if( p-
9da0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
9db0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
9dc0: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
9dd0: 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61 67  ck(p);.  }.  pag
9de0: 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20  er_unlock(p);.  
9df0: 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f  assert( p->errCo
9e00: 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61  de || !p->journa
9e10: 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63  lOpen || (p->exc
9e20: 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e  lusiveMode&&!p->
9e30: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20  journalOff) );. 
9e40: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43   assert( p->errC
9e50: 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f  ode || !p->stmtO
9e60: 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73  pen || p->exclus
9e70: 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a 2f  iveMode );.}.../
9e80: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69  *.** Clear the i
9e90: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
9ea0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
9eb0: 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
9ec0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63  of the pager bac
9ed0: 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73  k to what it was
9ee0: 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72   when it was fir
9ef0: 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41  st.** opened.  A
9f00: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ny outstanding p
9f10: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
9f20: 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75  ated and subsequ
9f30: 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ent attempts.** 
9f40: 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20  to access those 
9f50: 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  pages will likel
9f60: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  y result in a co
9f70: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69  redump..*/.stati
9f80: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
9f90: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
9fa0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
9fb0: 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70   *pNext;.  if( p
9fc0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
9fd0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
9fe0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
9ff0: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
a000: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
a010: 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c  PGFREE %p %d\n",
a020: 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
a030: 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  no));.    PAGER_
a040: 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
a050: 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
a060: 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  ;.    pNext = pP
a070: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
a080: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
a090: 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
a0a0: 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  ->pStmt = 0;.  p
a0b0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
a0c0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
a0d0: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
a0e0: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
a0f0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
a100: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ll = 0;.  pPager
a110: 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73  ->nHash = 0;.  s
a120: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
a130: 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50  er->aHash);.  pP
a140: 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
a150: 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  .  pPager->aHash
a160: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
a170: 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  nRef = 0;.}../*.
a180: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a190: 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
a1a0: 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69  on.  A transacti
a1b0: 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65  on is ended by e
a1c0: 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49  ither.** a COMMI
a1d0: 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e  T or a ROLLBACK.
a1e0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
a1f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
a200: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61  ed, the pager ha
a210: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
a220: 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61  le open and.** a
a230: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
a240: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
a250: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
a260: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
a270: 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64  release.** the d
a280: 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64  atabase lock and
a290: 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52   acquires a SHAR
a2a0: 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70  ED lock in its p
a2b0: 6c 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a  lace if that is.
a2c0: 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ** the appropria
a2d0: 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20  te thing to do. 
a2e0: 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75   Release locks u
a2f0: 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70  sually is approp
a300: 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73  riate,.** unless
a310: 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75   we are in exclu
a320: 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
a330: 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20   or unless this 
a340: 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20  is a .** COMMIT 
a350: 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c  AND BEGIN or ROL
a360: 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20  LBACK AND BEGIN 
a370: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
a380: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
a390: 65 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65  e is either dele
a3a0: 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64  ted or truncated
a3b0: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f  ..**.** TODO: Co
a3c0: 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74  nsider keeping t
a3d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a3e0: 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61  open for tempora
a3f0: 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ry databases..**
a400: 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65   This might give
a410: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69   a performance i
a420: 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69  mprovement on wi
a430: 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e  ndows where open
a440: 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73  ing.** a file is
a450: 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70   an expensive op
a460: 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
a470: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
a480: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
a490: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
a4a0: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
a4b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a4c0: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
a4d0: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
a4e0: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
a4f0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
a500: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
a510: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a520: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71  ITE_OK;.  }.  sq
a530: 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
a540: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
a550: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
a560: 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d  Open && !pPager-
a570: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
a580: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
a590: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66  lose(pPager->stf
a5a0: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
a5b0: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  stmtOpen = 0;.  
a5c0: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
a5d0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
a5e0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
a5f0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
a600: 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d          && (rc =
a610: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
a620: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
a630: 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
a640: 7b 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  {;.      pPager-
a650: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
a660: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
a670: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
a680: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
a690: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
a6a0: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
a6b0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
a6c0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
a6d0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
a6e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a6f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a700: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
a710: 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
a720: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
a730: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
a740: 6c 69 74 65 33 5f 66 72 65 65 28 20 70 50 61 67  lite3_free( pPag
a750: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
a760: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
a770: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
a780: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
a790: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
a7a0: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
a7b0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
a7c0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
a7d0: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
a7e0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
a7f0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sync = 0;.      
a800: 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
a810: 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  ack = 0;.#ifdef 
a820: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
a830: 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  ES.      pPg->pa
a840: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
a850: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
a860: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
a870: 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
a880: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
a890: 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
a8a0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
a8b0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
a8c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a8d0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
a8e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a8f0: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
a900: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
a910: 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  useJournal==0 );
a920: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
a930: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
a940: 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  de ){.    rc2 = 
a950: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
a960: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
a970: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
a980: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
a990: 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  RED;.  }else if(
a9a0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
a9b0: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a  PAGER_SYNCED ){.
a9c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
a9d0: 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
a9e0: 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  IVE;.  }.  pPage
a9f0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
aa00: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
aa10: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
aa20: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
aa30: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46   0;.  pPager->pF
aa40: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
aa50: 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ger->pFirst;.  p
aa60: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
aa70: 2d 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72  -1;..  return (r
aa80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32  c==SQLITE_OK?rc2
aa90: 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  :rc);.}../*.** C
aaa0: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
aab0: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72  n a checksum for
aac0: 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74   the page of dat
aad0: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  a..**.** This is
aae0: 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
aaf0: 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61  ksum.  It is rea
ab00: 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
ab10: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
ab20: 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
ab30: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75   and the page nu
ab40: 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69  mber.  We experi
ab50: 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  mented with.** a
ab60: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65   checksum of the
ab70: 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75   entire data, bu
ab80: 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64  t that was found
ab90: 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e   to be too slow.
aba0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
abb0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
abc0: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
abd0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
abe0: 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ata and.** the c
abf0: 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65  hecksum is store
ac00: 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
ac10: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
ac20: 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  .  If journal.**
ac30: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
ac40: 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
ac50: 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
ac60: 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61  ost likely scena
ac70: 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f  rio.** is that o
ac80: 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
ac90: 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
aca0: 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
acb0: 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63  d.  It is.** muc
acc0: 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
acd0: 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
ace0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
acf0: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
ad00: 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
ad10: 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
ad20: 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
ad30: 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
ad40: 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
ad50: 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
ad60: 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
ad70: 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
ad80: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a  corruption..**.*
ad90: 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69  * FIX ME:  Consi
ada0: 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79  der adding every
adb0: 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62   200th (or so) b
adc0: 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  yte of the data 
add0: 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73  to the.** checks
ade0: 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66  um.  That way if
adf0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73   a single page s
ae00: 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64  pans 3 or more d
ae10: 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a  isk sectors and.
ae20: 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64  ** only the midd
ae30: 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72  le sector is cor
ae40: 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74  rupt, we will st
ae50: 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f  ill have a reaso
ae60: 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20  nable.** chance 
ae70: 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63  of failing the c
ae80: 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73  hecksum and thus
ae90: 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70   detecting the p
aea0: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69  roblem..*/.stati
aeb0: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
aec0: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
aed0: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
aee0: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
aef0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
af00: 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50  it;.  int i = pP
af10: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
af20: 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30  00;.  while( i>0
af30: 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
af40: 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
af50: 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
af60: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
af70: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
af80: 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
af90: 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28   void makeClean(
afa0: 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  PgHdr*);../*.** 
afb0: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
afc0: 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ge from the jour
afd0: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  nal file opened 
afe0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
aff0: 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79  or.** jfd.  Play
b000: 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61  back this one pa
b010: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65  ge..**.** If use
b020: 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e  Cksum==0 it mean
b030: 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64  s this journal d
b040: 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63  oes not use chec
b050: 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d  ksums.  Checksum
b060: 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65  s.** are not use
b070: 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a  d in statement j
b080: 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20  ournals because 
b090: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
b0a0: 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65  ls do not.** nee
b0b0: 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77  d to survive pow
b0c0: 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a  er failures..*/.
b0d0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b0e0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
b0f0: 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
b100: 67 65 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  ger, .  sqlite3_
b110: 66 69 6c 65 20 2a 6a 66 64 2c 0a 20 20 69 36 34  file *jfd,.  i64
b120: 20 6f 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 75   offset,.  int u
b130: 73 65 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74  seCksum.){.  int
b140: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
b150: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
b160: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
b170: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
b180: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
b190: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
b1a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b1b0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
b1c0: 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
b1d0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
b200: 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
b210: 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38  checking */.  u8
b220: 20 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29   *aData = (u8 *)
b230: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
b240: 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f  e;   /* Temp sto
b250: 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20  rage for a page 
b260: 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75  */..  /* useCksu
b270: 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65  m should be true
b280: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f   for the main jo
b290: 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20  urnal and false 
b2a0: 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  for.  ** stateme
b2b0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65  nt journals.  Ve
b2c0: 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69  rify that this i
b2d0: 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73  s always the cas
b2e0: 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
b2f0: 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75   jfd == (useCksu
b300: 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  m ? pPager->jfd 
b310: 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20  : pPager->stfd) 
b320: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  );.  assert( aDa
b330: 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65  ta );..  rc = re
b340: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66  ad32bits(jfd, of
b350: 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  fset, &pgno);.  
b360: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b370: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
b380: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
b390: 65 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20  ead(jfd, aData, 
b3a0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b3b0: 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 69  , offset+4);.  i
b3c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b3d0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
b3e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b3f0: 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
b400: 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f  geSize + 4;..  /
b410: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
b420: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
b430: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
b440: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
b450: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
b460: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
b470: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
b480: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
b490: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
b4a0: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
b4b0: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
b4c0: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
b4d0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
b4e0: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
b4f0: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
b500: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
b510: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
b520: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
b530: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
b540: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
b550: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
b560: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
b570: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
b580: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
b590: 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50  gno>(unsigned)pP
b5a0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
b5b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b5c0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
b5d0: 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20  useCksum ){.    
b5e0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
b5f0: 6a 66 64 2c 20 6f 66 66 73 65 74 2b 70 50 61 67  jfd, offset+pPag
b600: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
b610: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
b620: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
b630: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
b640: 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
b650: 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
b660: 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
b670: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
b680: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
b690: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
b6a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
b6b0: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
b6c0: 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65  ESERVED || pPage
b6d0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
b6e0: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
b6f0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
b700: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
b710: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
b720: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
b730: 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
b740: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
b750: 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
b760: 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
b770: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
b780: 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
b790: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
b7a0: 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
b7b0: 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
b7c0: 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
b7d0: 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
b7e0: 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
b7f0: 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
b800: 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
b810: 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
b820: 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
b830: 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
b840: 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
b850: 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
b860: 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
b870: 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
b880: 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
b890: 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
b8a0: 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
b8b0: 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
b8c0: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
b8d0: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
b8e0: 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
b8f0: 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
b900: 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
b910: 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
b920: 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
b930: 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
b940: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
b950: 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61  in EXCLUSIVE sta
b960: 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
b970: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
b980: 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a  he if it exists.
b990: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69    ** and the mai
b9a0: 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
b9b0: 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
b9c0: 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a  not dirty..  **.
b9d0: 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
b9e0: 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
b9f0: 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
ba00: 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
ba10: 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
ba20: 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
ba30: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
ba40: 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
ba50: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
ba60: 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
ba70: 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
ba80: 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
ba90: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
baa0: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
bab0: 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
bac0: 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
bad0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
bae0: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
baf0: 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
bb00: 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
bb10: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
bb20: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
bb30: 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
bb40: 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
bb50: 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
bb60: 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
bb70: 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
bb80: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
bb90: 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
bba0: 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
bbb0: 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
bbc0: 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
bbd0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
bbe0: 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
bbf0: 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
bc00: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
bc10: 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
bc20: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
bc30: 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
bc40: 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
bc50: 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
bc60: 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
bc70: 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
bc80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
bc90: 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
bca0: 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
bcb0: 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
bcc0: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
bcd0: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
bce0: 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
bcf0: 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
bd00: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
bd10: 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
bd20: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
bd30: 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
bd40: 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
bd50: 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
bd60: 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  =0..  */.  pPg =
bd70: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
bd80: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50  ager, pgno);.  P
bd90: 41 47 45 52 54 52 41 43 45 34 28 22 50 4c 41 59  AGERTRACE4("PLAY
bda0: 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
bdb0: 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
bdd0: 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
bde0: 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
bdf0: 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
be00: 53 69 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a 20  Size, aData));. 
be10: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
be20: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
be30: 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c  IVE && (pPg==0 |
be40: 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  | pPg->needSync=
be50: 3d 30 29 20 29 7b 0a 20 20 20 20 69 36 34 20 6f  =0) ){.    i64 o
be60: 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
be70: 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
be80: 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
be90: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
bea0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74  pPager->fd, aDat
beb0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
bec0: 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ize, offset);.  
bed0: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
bee0: 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
bef0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
bf00: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
bf10: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
bf20: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
bf30: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
bf40: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
bf50: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
bf60: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
bf70: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
bf80: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
bf90: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
bfa0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
bfb0: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
bfc0: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
bfd0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
bfe0: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
bff0: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
c000: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
c010: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
c020: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
c030: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
c040: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
c050: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
c060: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67    /* assert( pPg
c070: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67  ->nRef==0 || pPg
c080: 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a  ->pgno==1 ); */.
c090: 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44      pData = PGHD
c0a0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
c0b0: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
c0c0: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
c0d0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
c0e0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
c0f0: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70  niter ){.      p
c100: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
c110: 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  (pPg, pPager->pa
c120: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  geSize);.    }.#
c130: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
c140: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
c150: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
c160: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
c170: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
c180: 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
c190: 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
c1a0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
c1b0: 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
c1c0: 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
c1d0: 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
c1e0: 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
c1f0: 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
c200: 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
c210: 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
c220: 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
c230: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
c240: 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
c250: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
c260: 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
c270: 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
c280: 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
c290: 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
c2a0: 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72  gno, 3);.  }.  r
c2b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c2c0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
c2d0: 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
c2e0: 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
c2f0: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
c300: 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
c310: 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
c320: 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
c330: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
c340: 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
c350: 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
c360: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
c370: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
c380: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
c390: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c3a0: 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
c3b0: 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
c3c0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
c3d0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
c3e0: 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ins the names of
c3f0: 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e   all child journ
c400: 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20  als..** To tell 
c410: 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  if a master jour
c420: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
c430: 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63  ed, check to eac
c440: 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c  h of the.** chil
c450: 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68  dren.  If all ch
c460: 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65  ildren are eithe
c470: 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20  r missing or do 
c480: 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20  not refer to.** 
c490: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74  a different mast
c4a0: 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  er journal, then
c4b0: 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75   this master jou
c4c0: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
c4d0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
c4e0: 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
c4f0: 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
c500: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
c510: 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
c520: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
c530: 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
c540: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74  t rc;.  int mast
c550: 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73  er_open = 0;.  s
c560: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
c570: 73 74 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ster;.  sqlite3_
c580: 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a  file *pJournal;.
c590: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
c5a0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
c5b0: 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
c5c0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
c5d0: 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
c5e0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
c5f0: 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
c600: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
c610: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d  .  /* Open the m
c620: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
c630: 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  le exclusively i
c640: 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65  n case some othe
c650: 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69  r process.  ** i
c660: 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72  s running this r
c670: 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74  outine also. Not
c680: 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74   that it makes t
c690: 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e  oo much differen
c6a0: 63 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ce..  */.  pMast
c6b0: 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
c6c0: 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  le *)sqlite3_mal
c6d0: 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  loc(pVfs->szOsFi
c6e0: 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
c6f0: 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
c700: 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
c710: 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
c720: 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
c730: 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
c740: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
c750: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
c760: 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
c770: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
c780: 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
c790: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  STER_JOURNAL);. 
c7a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c7b0: 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73  sOpen(pVfs, zMas
c7c0: 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c  ter, pMaster, fl
c7d0: 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ags, 0);.  }.  i
c7e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c7f0: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
c800: 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f  r_out;.  master_
c810: 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20  open = 1;..  rc 
c820: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
c830: 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d  ize(pMaster, &nM
c840: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
c850: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c860: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
c870: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20  ter_out;..  if( 
c880: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30  nMasterJournal>0
c890: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a   ){.    char *zJ
c8a0: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72  ournal;.    char
c8b0: 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30   *zMasterPtr = 0
c8c0: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
c8d0: 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
c8e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
c8f0: 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
c900: 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  d from.    ** sq
c910: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
c920: 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
c930: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
c940: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61   .    */.    zMa
c950: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63  sterJournal = (c
c960: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
c970: 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72  lloc(nMasterJour
c980: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  nal);.    if( !z
c990: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
c9a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
c9b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
c9c0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
c9d0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
c9e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
c9f0: 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
ca00: 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65  rJournal, nMaste
ca10: 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
ca20: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ca30: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
ca40: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a  ster_out;..    z
ca50: 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
ca60: 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68  rJournal;.    wh
ca70: 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
ca80: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
ca90: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
caa0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
cab0: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
cac0: 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
cad0: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29  E_ACCESS_EXISTS)
cae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
caf0: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
cb00: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
cb10: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
cb20: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
cb30: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
cb40: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
cb50: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
cb60: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
cb70: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
cb80: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
cb90: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
cba0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
cbb0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
cbc0: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
cbd0: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
cbe0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
cbf0: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
cc00: 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
cc10: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
cc20: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
cc30: 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
cc40: 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
cc50: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
cc60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cc70: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
cc80: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
cc90: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
cca0: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
ccb0: 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 26 7a  nal(pJournal, &z
ccc0: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
ccd0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
cce0: 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
ccf0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
cd00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
cd10: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
cd20: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
cd30: 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
cd40: 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26 26  zMasterPtr!=0 &&
cd50: 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
cd60: 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
cd70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cd80: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72  _free(zMasterPtr
cd90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
cda0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
cdb0: 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
cdc0: 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
cdd0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cde0: 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
cdf0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
ce00: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
ce10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ce20: 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
ce30: 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b  trlen(zJournal)+
ce40: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
ce50: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
ce60: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
ce70: 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d  aster, 0);..delm
ce80: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
ce90: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
cea0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
ceb0: 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
cec0: 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
ced0: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a   master_open ){.
cee0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
cef0: 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d  se(pMaster);.  }
cf00: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
cf10: 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
cf20: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69  rn rc;.}...stati
cf30: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75  c void pager_tru
cf40: 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61 67 65  ncate_cache(Page
cf50: 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a  r *pPager);../*.
cf60: 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
cf70: 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65  main file of the
cf80: 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20   given pager to 
cf90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
cfa0: 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64  ges.** indicated
cfb0: 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61 74 65 20  . Also truncate 
cfc0: 74 68 65 20 63 61 63 68 65 64 20 72 65 70 72 65  the cached repre
cfd0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
cfe0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
cff0: 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
d000: 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
d010: 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20  r, int nPage){. 
d020: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d030: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
d040: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
d050: 45 58 43 4c 55 53 49 56 45 20 26 26 20 70 50 61  EXCLUSIVE && pPa
d060: 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
d070: 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  s ){.    rc = sq
d080: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
d090: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
d0a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
d0b0: 34 29 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  4)nPage);.  }.  
d0c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d0d0: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
d0e0: 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
d0f0: 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  .    pager_trunc
d100: 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
d110: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d120: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
d130: 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20   the sectorSize 
d140: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
d150: 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ger..**.** The s
d160: 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 74 68  ector size is th
d170: 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20  e larger of the 
d180: 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f  sector size repo
d190: 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74  rted.** by sqlit
d1a0: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
d1b0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 53 69 7a   and the pageSiz
d1c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
d1d0: 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
d1e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
d1f0: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
d200: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
d210: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
d220: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
d230: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
d240: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
d250: 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
d260: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
d270: 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
d280: 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
d290: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
d2a0: 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69 68  ed yet, in whcih
d2b0: 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
d2c0: 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
d2d0: 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
d2e0: 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  lt..    */.    p
d2f0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
d300: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
d310: 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
d320: 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  fd);.  }.  if( p
d330: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
d340: 65 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e<pPager->pageSi
d350: 7a 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ze ){.    pPager
d360: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 70  ->sectorSize = p
d370: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
d380: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
d390: 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
d3a0: 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
d3b0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
d3c0: 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
d3d0: 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
d3e0: 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
d3f0: 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
d400: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
d410: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
d420: 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
d430: 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
d440: 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
d450: 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
d460: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
d470: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
d480: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
d490: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
d4a0: 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
d4b0: 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
d4c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
d4d0: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
d4e0: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
d4f0: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
d500: 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
d510: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
d520: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
d530: 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
d540: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
d550: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
d560: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
d570: 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
d580: 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
d590: 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
d5a0: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
d5b0: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
d5c0: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
d5d0: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
d5e0: 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
d5f0: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
d600: 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
d610: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
d620: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
d630: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
d640: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
d650: 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
d660: 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
d670: 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
d680: 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
d690: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
d6a0: 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29  ournal.).**  (6)
d6b0: 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
d6c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d6d0: 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
d6e0: 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
d6f0: 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
d700: 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
d710: 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
d720: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
d730: 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
d740: 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
d750: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
d760: 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
d770: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
d780: 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
d790: 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
d7a0: 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
d7b0: 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37  in UTF-8..**  (7
d7c0: 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
d7d0: 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
d7e0: 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
d7f0: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
d800: 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
d810: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
d820: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d830: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
d840: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
d850: 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
d860: 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
d870: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d880: 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
d890: 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65 6d  the first 6 item
d8a0: 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
d8b0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
d8c0: 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
d8d0: 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68 20  ance of the 7th 
d8e0: 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
d8f0: 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
d900: 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
d910: 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
d920: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
d930: 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
d940: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
d950: 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
d960: 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
d970: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
d980: 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
d990: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d9a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
d9b0: 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
d9c0: 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
d9d0: 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
d9e0: 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
d9f0: 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
da00: 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
da10: 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
da20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
da30: 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
da40: 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
da50: 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
da60: 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
da70: 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
da80: 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
da90: 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
daa0: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
dab0: 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
dac0: 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
dad0: 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
dae0: 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
daf0: 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
db00: 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
db10: 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
db20: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
db30: 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
db40: 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
db50: 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
db60: 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
db70: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
db80: 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
db90: 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
dba0: 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
dbb0: 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
dbc0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
dbd0: 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
dbe0: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
dbf0: 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
dc00: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
dc10: 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
dc20: 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
dc30: 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
dc40: 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
dc50: 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
dc60: 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
dc70: 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
dc80: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
dc90: 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
dca0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
dcb0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
dcc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
dcd0: 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
dce0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
dcf0: 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
dd00: 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
dd10: 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
dd20: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
dd30: 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
dd40: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
dd50: 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
dd60: 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
dd70: 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
dd80: 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
dd90: 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
dda0: 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
ddb0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
ddc0: 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
ddd0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
dde0: 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
ddf0: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
de00: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
de10: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
de20: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
de30: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
de40: 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
de50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
de60: 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
de70: 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
de80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
de90: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
dea0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
deb0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
dec0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
ded0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
dee0: 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
def0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
df00: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
df10: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
df20: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
df30: 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
df40: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
df50: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
df60: 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
df70: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
df80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
df90: 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
dfa0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
dfb0: 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
dfc0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
dfd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
dfe0: 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a  file if any */..
dff0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
e000: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
e010: 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
e020: 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
e030: 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
e040: 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
e050: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
e060: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
e070: 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  en );.  rc = sql
e080: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
e090: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
e0a0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
e0b0: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30  ITE_OK || szJ==0
e0c0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
e0d0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
e0e0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61    /* Read the ma
e0f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
e100: 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
e110: 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  al, if it is pre
e120: 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20  sent..  ** If a 
e130: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e140: 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63  ile name is spec
e150: 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66  ified, but the f
e160: 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ile is not.  ** 
e170: 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c  present on disk,
e180: 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
e190: 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64  l is not hot and
e1a0: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
e1b0: 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64  o be.  ** played
e1c0: 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63   back..  */.  rc
e1d0: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
e1e0: 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
e1f0: 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61  , &zMaster);.  a
e200: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
e210: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  E_DONE );.  if( 
e220: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc!=SQLITE_OK . 
e230: 20 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26    || (zMaster &&
e240: 20 21 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73   !sqlite3OsAcces
e250: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
e260: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
e270: 58 49 53 54 53 29 29 20 0a 20 20 29 7b 0a 20 20  XISTS)) .  ){.  
e280: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
e290: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
e2a0: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  ster = 0;.    if
e2b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
e2c0: 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  E ) rc = SQLITE_
e2d0: 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  OK;.    goto end
e2e0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
e2f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e300: 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  Off = 0;..  /* T
e310: 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
e320: 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
e330: 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  the readJournalH
e340: 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  dr() call return
e350: 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  s.  ** SQLITE_DO
e360: 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
e370: 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77  r occurs. */.  w
e380: 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20  hile( 1 ){..    
e390: 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74  /* Read the next
e3a0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e3b0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
e3c0: 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
e3d0: 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   are.    ** not 
e3e0: 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66  enough bytes lef
e3f0: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
e400: 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70   file for a comp
e410: 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a  lete header, or.
e420: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72      ** it is cor
e430: 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70  rupted, then a p
e440: 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66  rocess must of f
e450: 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74  ailed while writ
e460: 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54  ing it..    ** T
e470: 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f  his indicates no
e480: 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73  thing more needs
e490: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
e4a0: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
e4b0: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
e4c0: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
e4d0: 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
e4e0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e4f0: 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
e500: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
e510: 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
e520: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
e530: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
e540: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
e550: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
e560: 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
e570: 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
e580: 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
e590: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
e5a0: 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
e5b0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
e5c0: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
e5d0: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
e5e0: 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
e5f0: 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
e600: 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
e610: 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
e620: 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
e630: 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
e640: 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
e650: 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
e660: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
e670: 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
e680: 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
e690: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
e6a0: 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
e6b0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
e6c0: 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
e6d0: 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
e6e0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
e6f0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
e700: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ger);.    }..   
e710: 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
e720: 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61   and this rollba
e730: 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73  ck is of a trans
e740: 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62  action created b
e750: 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72  y this.    ** pr
e760: 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69  ocess and if thi
e770: 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68  s is the final h
e780: 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75  eader in the jou
e790: 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65  rnal, then it me
e7a0: 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ans.    ** that 
e7b0: 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
e7c0: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
e7d0: 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61  ng filled but ha
e7e0: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20  s not yet been. 
e7f0: 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20     ** synced to 
e800: 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74  disk.  Compute t
e810: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
e820: 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  es based on the 
e830: 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  remaining.    **
e840: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
e850: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
e860: 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20   The third term 
e870: 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20  of the test was 
e880: 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63  added to fix tic
e890: 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a  ket #2565..    *
e8a0: 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
e8b0: 30 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20  0 && !isHot &&. 
e8c0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
e8d0: 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
e8e0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
e8f0: 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
e900: 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52  lOff ){.      nR
e910: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67  ec = (szJ - pPag
e920: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
e930: 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
e940: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPager);.    }..
e950: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
e960: 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
e970: 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
e980: 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
e990: 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
e9a0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
e9b0: 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61   to it's origina
e9c0: 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
e9d0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
e9e0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
e9f0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
ea00: 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
ea10: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
ea20: 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
ea30: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ea40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
ea50: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
ea60: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
ea70: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  }..    /* Copy o
ea80: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
ea90: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
eaa0: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
eab0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
eac0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
ead0: 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b  (i=0; i<nRec; i+
eae0: 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
eaf0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
eb00: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
eb10: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
eb20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
eb30: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
eb40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
eb50: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
eb60: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
eb70: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
eb80: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
eb90: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
eba0: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
ebb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ebc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ebd0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
ebe0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
ebf0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ec00: 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
ec10: 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  HED*/.  assert( 
ec20: 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  0 );..end_playba
ec30: 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
ec40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
ec50: 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
ec60: 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
ec70: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61  );.  }.  if( zMa
ec80: 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ster ){.    /* I
ec90: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
eca0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
ecb0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
ecc0: 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
ecd0: 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
ece0: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
ecf0: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
ed00: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
ed10: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
ed20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ed30: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
ed40: 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
ed50: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7d   zMaster);.    }
ed60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
ed70: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(zMaster);.  }.
ed80: 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
ed90: 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
eda0: 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
edb0: 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
edc0: 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
edd0: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
ede0: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
edf0: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
ee00: 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
ee10: 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
ee20: 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
ee30: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
ee40: 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
ee50: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
ee60: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
ee70: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c   rc;.}../*.** Pl
ee80: 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  ayback the state
ee90: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
eea0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69  .** This is simi
eeb0: 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  lar to playing b
eec0: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
eed0: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20  ion journal but 
eee0: 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78  with.** a few ex
eef0: 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a  tra twists..**.*
ef00: 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75  *    (1)  The nu
ef10: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
ef20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ef30: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
ef40: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  of.**         th
ef50: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  e statement is s
ef60: 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d  tored in pPager-
ef70: 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69  >stmtSize, not i
ef80: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
ef90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
efa0: 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  self..**.**    (
efb0: 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  2)  In addition 
efc0: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
efd0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
efe0: 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20  urnal, also.**  
eff0: 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20         playback 
f000: 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65  all pages of the
f010: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
f020: 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  rnal beginning.*
f030: 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66  *         at off
f040: 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  set pPager->stmt
f050: 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  JSize..*/.static
f060: 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f   int pager_stmt_
f070: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
f080: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73  pPager){.  i64 s
f090: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
f0a0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
f0b0: 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
f0c0: 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b  */.  i64 hdrOff;
f0d0: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f0f0: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
f100: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f120: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
f130: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73  /.  int rc;..  s
f140: 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
f150: 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66  rnalOff;.#ifndef
f160: 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20   NDEBUG .  {.   
f170: 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20   i64 os_szJ;.   
f180: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
f190: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
f1a0: 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20  jfd, &os_szJ);. 
f1b0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f1c0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
f1d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
f1e0: 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d  J==os_szJ );.  }
f1f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65  .#endif..  /* Se
f200: 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74  t hdrOff to be t
f210: 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61  he offset just a
f220: 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
f230: 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c  the last journal
f240: 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74  .  ** page writt
f250: 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  en before the fi
f260: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
f270: 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  er for this stat
f280: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
f290: 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74  action was writt
f2a0: 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f  en, or the end o
f2b0: 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f  f the file if no
f2c0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65   journal.  ** he
f2d0: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
f2e0: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20  ..  */.  hdrOff 
f2f0: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  = pPager->stmtHd
f300: 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  rOff;.  assert( 
f310: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
f320: 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20   || !hdrOff );. 
f330: 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a   if( !hdrOff ){.
f340: 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a      hdrOff = szJ
f350: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72  ;.  }.  .  /* Tr
f360: 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
f370: 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ase back to its 
f380: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
f390: 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
f3a0: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
f3b0: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
f3c0: 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ze);.  assert( p
f3d0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
f3e0: 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
f3f0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
f400: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
f410: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
f420: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
f430: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
f440: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
f450: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
f460: 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20  lOpen );.  nRec 
f470: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
f480: 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  ec;.  .  /* Copy
f490: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
f4a0: 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  out of the state
f4b0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ment journal and
f4c0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20   back into the. 
f4d0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
f4e0: 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68  e.  Note that th
f4f0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
f500: 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73  nal omits checks
f510: 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61  ums from.  ** ea
f520: 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20  ch record since 
f530: 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65  power-failure re
f540: 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d  covery is not im
f550: 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65  portant to state
f560: 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ment.  ** journa
f570: 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ls..  */.  for(i
f580: 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
f590: 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  {.    i64 offset
f5a0: 20 3d 20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e   = i*(4+pPager->
f5b0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72  pageSize);.    r
f5c0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
f5d0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
f5e0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64  er, pPager->stfd
f5f0: 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20  , offset, 0);.  
f600: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f610: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
f620: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f630: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
f640: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
f650: 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20  ..  /* Now roll 
f660: 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20  some pages back 
f670: 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63  from the transac
f680: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61  tion journal. Pa
f690: 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20  ger.stmtJSize.  
f6a0: 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20  ** was the size 
f6b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
f6c0: 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74  ile when this st
f6d0: 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
f6e0: 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65  ted, so.  ** eve
f6f0: 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68  rything after th
f700: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  at needs to be r
f710: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68  olled back, eith
f720: 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  er into the.  **
f730: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d   database, the m
f740: 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20  emory cache, or 
f750: 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  both..  **.  ** 
f760: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72  If it is not zer
f770: 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74  o, then Pager.st
f780: 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20  mtHdrOff is the 
f790: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
f7a0: 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
f7b0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
f7c0: 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72  ader written dur
f7d0: 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65  ing this stateme
f7e0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
f7f0: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a    */.  pPager->j
f800: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67  ournalOff = pPag
f810: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20  er->stmtJSize;. 
f820: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
f830: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  it = pPager->stm
f840: 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28  tCksum;.  while(
f850: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f860: 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a  Off < hdrOff ){.
f870: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
f880: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
f890: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
f8a0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
f8b0: 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20  urnalOff, 1);.  
f8c0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f8d0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
f8e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f8f0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
f900: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
f910: 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ..  while( pPage
f920: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
f930: 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  szJ ){.    u32 n
f940: 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  JRec;         /*
f950: 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
f960: 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
f970: 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
f980: 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
f990: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
f9a0: 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
f9b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
f9c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f9d0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f9e0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
f9f0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
fa00: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
fa10: 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
fa20: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63  0 ){.      nJRec
fa30: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
fa40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
fa50: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
fa60: 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e+8);.    }.    
fa70: 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69  for(i=nJRec-1; i
fa80: 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  >=0 && pPager->j
fa90: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b  ournalOff < szJ;
faa0: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20   i--){.      rc 
fab0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
fac0: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
fad0: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  , pPager->jfd, p
fae0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
faf0: 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73  f, 1);.      ass
fb00: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
fb10: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66  DONE );.      if
fb20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fb30: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
fb40: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
fb50: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
fb60: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
fb70: 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  .  .end_stmt_pla
fb80: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
fb90: 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20  =SQLITE_OK) {.  
fba0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
fbb0: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
fbc0: 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f  /* pager_reload_
fbd0: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a  cache(pPager); *
fbe0: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  /.  }.  return r
fbf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
fc00: 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
fc10: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
fc20: 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
fc30: 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
fc40: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
fc50: 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
fc60: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
fc70: 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
fc80: 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70  Page>10 ){.    p
fc90: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
fca0: 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  mxPage;.  }else{
fcb0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
fcc0: 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a  age = 10;.  }.}.
fcd0: 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
fce0: 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
fcf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
fd00: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
fd10: 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
fd20: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
fd30: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
fd40: 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
fd50: 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
fd60: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
fd70: 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
fd80: 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
fd90: 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
fda0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
fdb0: 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
fdc0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
fdd0: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
fde0: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
fdf0: 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
fe00: 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
fe10: 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
fe20: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
fe30: 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
fe40: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
fe50: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
fe60: 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
fe70: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
fe80: 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
fe90: 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
fea0: 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
feb0: 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
fec0: 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
fed0: 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
fef0: 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
ff00: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
ff10: 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
ff20: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
ff30: 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
ff40: 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
ff50: 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
ff60: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
ff70: 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
ff80: 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
ff90: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
ffa0: 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
ffb0: 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
ffc0: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
ffd0: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
fff0: 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
10000 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
10010 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
10020 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
10030 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
10040 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
10050 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
10060 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
10070 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
10080 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
10090 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
100a0 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
100b0 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
100c0 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
100d0 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
100e0 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
10100 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
10110 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
10120 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
10130 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
10140 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
10150 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
10160 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
10170 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
10180 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
10190 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
101a0 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
101b0 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
101c0 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
101d0 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
101e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
101f0 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
10200 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
10210 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
10220 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
10230 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  el, int full_fsy
10240 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
10250 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d  oSync =  level==
10260 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
10270 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
10280 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65  >fullSync = leve
10290 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d  l==3 && !pPager-
102a0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
102b0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
102c0 3d 20 28 66 75 6c 6c 5f 66 73 79 6e 63 3f 53 51  = (full_fsync?SQ
102d0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53  LITE_SYNC_FULL:S
102e0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
102f0 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  L);.  if( pPager
10300 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
10310 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
10320 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
10330 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
10340 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
10350 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
10360 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
10370 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
10380 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
10390 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
103a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
103b0 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
103c0 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
103d0 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
103e0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
103f0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
10400 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
10410 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
10420 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
10430 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  . .**.** Write t
10440 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
10450 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65  or into *fd.  Re
10460 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10470 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d  n success or som
10480 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72  e.** other error
10490 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
104a0 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  . The OS will au
104b0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
104c0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
104d0 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74  .** file when it
104e0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
104f0 2a 20 49 66 20 7a 4e 61 6d 65 4f 75 74 20 69 73  * If zNameOut is
10500 20 30 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f   0, then SQLITE_
10510 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
10520 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  is passed to the
10530 20 4f 53 20 6c 61 79 65 72 2e 0a 2a 2a 20 49 66   OS layer..** If
10540 20 7a 4e 61 6d 65 4f 75 74 20 69 73 20 6e 6f 74   zNameOut is not
10550 20 30 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   0, SQLITE_OPEN_
10560 54 45 4d 50 5f 44 42 20 69 73 20 70 61 73 73 65  TEMP_DB is passe
10570 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
10580 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
10590 6e 74 65 6d 70 28 0a 20 20 73 71 6c 69 74 65 33  ntemp(.  sqlite3
105a0 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 73  _vfs *pVfs, .  s
105b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
105c0 6c 65 2c 20 0a 20 20 63 68 61 72 20 2a 7a 4e 61  le, .  char *zNa
105d0 6d 65 4f 75 74 0a 29 7b 0a 20 20 69 6e 74 20 63  meOut.){.  int c
105e0 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63  nt = 8;.  int rc
105f0 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
10600 28 0a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  (.     SQLITE_OP
10610 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
10620 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
10630 0a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  .     SQLITE_OPE
10640 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
10650 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
10660 43 4c 4f 53 45 0a 20 20 29 3b 0a 0a 20 20 63 68  CLOSE.  );..  ch
10670 61 72 20 2a 7a 46 72 65 65 20 3d 20 30 3b 0a 20  ar *zFree = 0;. 
10680 20 69 66 28 20 7a 4e 61 6d 65 4f 75 74 3d 3d 30   if( zNameOut==0
10690 20 29 7b 0a 20 20 20 20 7a 46 72 65 65 20 3d 20   ){.    zFree = 
106a0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
106b0 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 6d 78 50  malloc(pVfs->mxP
106c0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  athname);.    if
106d0 28 20 21 7a 46 72 65 65 20 29 7b 0a 20 20 20 20  ( !zFree ){.    
106e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
106f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
10700 20 7a 4e 61 6d 65 4f 75 74 20 3d 20 7a 46 72 65   zNameOut = zFre
10710 65 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  e;.    flags |= 
10720 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
10730 4f 55 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b  OURNAL;.  }else{
10740 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
10750 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
10760 42 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  B;.  }..#ifdef S
10770 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
10780 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
10790 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
107a0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
107b0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
107c0 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20  .#endif..  do{. 
107d0 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71     cnt--;.    sq
107e0 6c 69 74 65 33 4f 73 47 65 74 54 65 6d 70 4e 61  lite3OsGetTempNa
107f0 6d 65 28 70 56 66 73 2c 20 7a 4e 61 6d 65 4f 75  me(pVfs, zNameOu
10800 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
10810 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
10820 20 7a 4e 61 6d 65 4f 75 74 2c 20 70 46 69 6c 65   zNameOut, pFile
10830 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  , flags, 0);.   
10840 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
10850 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d  ITE_OK || pFile-
10860 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 7d  >pMethods );.  }
10870 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20  while( cnt>0 && 
10880 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
10890 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
108a0 4d 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  M );..  sqlite3_
108b0 66 72 65 65 28 7a 46 72 65 65 29 3b 0a 20 20 72  free(zFree);.  r
108c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
108d0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
108e0 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
108f0 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
10900 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
10910 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
10920 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
10930 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
10940 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
10950 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
10960 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
10970 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
10980 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73  agerGet() and is
10990 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20   only held open 
109a0 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73  until the.** las
109b0 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
109c0 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
109d0 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a  PagerUnref()..**
109e0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
109f0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
10a00 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
10a10 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
10a20 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
10a30 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
10a40 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
10a50 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
10a60 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
10a70 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
10a80 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
10a90 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
10aa0 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
10ab0 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  en all informati
10ac0 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
10ad0 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65  che..** It is ne
10ae0 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
10af0 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62  isk.  This can b
10b00 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
10b10 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d  ent an.** in-mem
10b20 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ory database..*/
10b30 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
10b40 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
10b50 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
10b60 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
10b70 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
10b80 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
10b90 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
10ba0 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
10bb0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
10bc0 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
10bd0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
10be0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
10bf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10c00 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
10c10 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
10c20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
10c30 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
10c40 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
10c50 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
10c60 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
10c70 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
10c80 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
10c90 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
10ca0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
10cb0 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  r = 0;.  int rc 
10cc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
10cd0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  nt i;.  int temp
10ce0 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  File = 0;.  int 
10cf0 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74  memDb = 0;.  int
10d00 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
10d10 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
10d20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
10d30 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
10d40 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  0;.  int noReadl
10d50 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
10d60 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
10d70 29 21 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72  )!=0;.  int jour
10d80 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71  nalFileSize = sq
10d90 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
10da0 28 70 56 66 73 29 3b 0a 20 20 69 6e 74 20 6e 44  (pVfs);.  int nD
10db0 65 66 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c  efaultPage = SQL
10dc0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
10dd0 5f 53 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a  _SIZE;.  char *z
10de0 50 61 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  Pathname;.  int 
10df0 6e 50 61 74 68 6e 61 6d 65 3b 0a 0a 20 20 2f 2a  nPathname;..  /*
10e00 20 54 68 65 20 64 65 66 61 75 6c 74 20 72 65 74   The default ret
10e10 75 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  urn is a NULL po
10e20 69 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61  inter */.  *ppPa
10e30 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  ger = 0;..  /* C
10e40 6f 6d 70 75 74 65 20 74 68 65 20 66 75 6c 6c 20  ompute the full 
10e50 70 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 7a 50  pathname */.  zP
10e60 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
10e70 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 6d  3_malloc(pVfs->m
10e80 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
10e90 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
10ea0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10eb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
10ec0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
10ed0 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
10ee0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
10ef0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
10f00 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
10f10 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
10f20 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ry:")==0 ){.    
10f30 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
10f40 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
10f50 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  = 0;.    }else.#
10f60 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
10f70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10f80 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
10f90 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  s, zFilename, zP
10fa0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
10fb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10fc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
10fd0 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
10fe0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ame);.        re
10ff0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
11000 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
11010 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
11020 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 50 61 74   = 0;.  }.  nPat
11030 68 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a  hname = strlen(z
11040 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a  Pathname);..  /*
11050 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
11060 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 73   for the pager s
11070 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50  tructure */.  pP
11080 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61  ager = sqlite3Ma
11090 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69  llocZero(.    si
110a0 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20  zeof(*pPager) + 
110b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
110c0 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
110d0 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
110e0 69 7a 65 20 2b 20 20 20 20 20 20 20 20 20 20 20  ize +           
110f0 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
11100 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ile structure */
11110 20 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73   .    pVfs->szOs
11120 46 69 6c 65 20 2a 20 32 20 2b 20 20 20 20 20 20  File * 2 +      
11130 20 20 2f 2a 20 54 68 65 20 64 62 20 61 6e 64 20    /* The db and 
11140 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  stmt journal fil
11150 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68  es */ .    nPath
11160 6e 61 6d 65 20 2a 20 33 20 2b 20 33 30 20 20 20  name * 3 + 30   
11170 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
11180 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f 72 79 2c  ame, zDirectory,
11190 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29   zJournal */.  )
111a0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20  ;.  if( !pPager 
111b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
111c0 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
111d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
111e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
111f0 50 74 72 20 3d 20 28 75 38 20 2a 29 26 70 50 61  Ptr = (u8 *)&pPa
11200 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ger[1];.  pPager
11210 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  ->fd = (sqlite3_
11220 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
11230 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20  ->szOsFile*0];. 
11240 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d 20   pPager->stfd = 
11250 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
11260 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
11270 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65 72  ile*1];.  pPager
11280 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  ->jfd = (sqlite3
11290 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
112a0 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b 0a  s->szOsFile*2];.
112b0 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
112c0 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50  ame = (char*)&pP
112d0 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
112e0 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  e*2+journalFileS
112f0 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize];.  pPager->
11300 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50  zDirectory = &pP
11310 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
11320 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20  nPathname+1];.  
11330 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
11340 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72   = &pPager->zDir
11350 65 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65  ectory[nPathname
11360 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  +1];.  pPager->p
11370 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 6d 65  Vfs = pVfs;.  me
11380 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  mcpy(pPager->zFi
11390 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  lename, zPathnam
113a0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b  e, nPathname+1);
113b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
113c0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f  zPathname);..  /
113d0 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
113e0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
113f0 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  ( pPager->zFilen
11400 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66  ame[0] ){.    if
11410 28 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56 66  ( nPathname>(pVf
11420 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20  s->mxPathname - 
11430 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c  sizeof("-journal
11440 22 29 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ")) ){.      rc 
11450 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
11460 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 2f 2a  N;.    }else{./*
11470 2a 2a 20 20 46 49 58 4d 45 3a 20 20 4d 69 67 68  **  FIXME:  Migh
11480 74 20 6e 65 65 64 20 74 6f 20 62 65 20 53 51 4c  t need to be SQL
11490 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
114a0 2e 20 20 4e 65 65 64 20 74 6f 20 70 61 73 73 20  .  Need to pass 
114b0 69 6e 0a 2a 2a 2a 2a 20 61 20 66 6c 61 67 20 66  in.**** a flag f
114c0 72 6f 6d 20 68 69 67 68 65 72 20 75 70 2e 0a 2a  rom higher up..*
114d0 2a 2a 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f  ***/.      int o
114e0 66 6c 61 67 20 3d 20 0a 20 20 20 20 20 20 20 20  flag = .        
114f0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
11500 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
11510 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51  E_OPEN_CREATE|SQ
11520 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
11530 42 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6f  B);.      int fo
11540 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ut = 0;.      rc
11550 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
11560 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
11570 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
11580 2d 3e 66 64 2c 20 6f 66 6c 61 67 2c 20 26 66 6f  ->fd, oflag, &fo
11590 75 74 29 3b 0a 20 20 20 20 20 20 72 65 61 64 4f  ut);.      readO
115a0 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
115b0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
115c0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
115d0 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
115e0 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
115f0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
11600 61 63 63 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a  access,.      **
11610 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
11620 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
11630 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
11640 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 20 20  reate the.      
11650 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
11660 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61  . The default pa
11670 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d  ge size is the m
11680 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20  aximum of:.     
11690 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
116a0 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  + SQLITE_DEFAULT
116b0 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20  _PAGE_SIZE,.    
116c0 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61    **    + The va
116d0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
116e0 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
116f0 69 7a 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 20  ize().      **  
11700 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
11710 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
11720 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
11730 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20  omically..      
11740 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  */.      if( rc=
11750 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72  =SQLITE_OK && !r
11760 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
11770 20 20 20 69 6e 74 20 69 53 65 63 74 6f 72 53 69     int iSectorSi
11780 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
11790 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
117a0 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >fd);.        if
117b0 28 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3c 69  ( nDefaultPage<i
117c0 53 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  SectorSize ){.  
117d0 20 20 20 20 20 20 20 20 6e 44 65 66 61 75 6c 74          nDefault
117e0 50 61 67 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Page = iSectorSi
117f0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69  ze;.        }.#i
11800 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11810 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
11820 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
11830 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
11840 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
11850 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
11860 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
11870 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
11880 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
11890 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
118a0 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
118b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
118c0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
118d0 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
118e0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
118f0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
11900 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
11910 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
11920 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 6e 44         for(ii=nD
11930 65 66 61 75 6c 74 50 61 67 65 3b 20 69 69 3c 3d  efaultPage; ii<=
11940 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
11950 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
11960 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
11970 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
11980 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
11990 7c 28 69 69 3e 3e 38 29 29 20 29 20 6e 44 65 66  |(ii>>8)) ) nDef
119a0 61 75 6c 74 50 61 67 65 20 3d 20 69 69 3b 0a 20  aultPage = ii;. 
119b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
119c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
119d0 20 20 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74      if( nDefault
119e0 50 61 67 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Page>SQLITE_MAX_
119f0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
11a00 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  E ){.          n
11a10 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20 53 51  DefaultPage = SQ
11a20 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
11a30 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
11a40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11a50 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
11a60 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 2f 2a  !memDb ){.    /*
11a70 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
11a80 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
11a90 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
11aa0 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
11ab0 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
11ac0 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
11ad0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
11ae0 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
11af0 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
11b00 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
11b10 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
11b20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
11b30 29 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74  )..    */ .    t
11b40 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
11b50 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
11b60 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
11b70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
11b80 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ger && rc==SQLIT
11b90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
11ba0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
11bb0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
11bc0 6d 61 6c 6c 6f 63 28 6e 44 65 66 61 75 6c 74 50  malloc(nDefaultP
11bd0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
11be0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
11bf0 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66  red in either of
11c00 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76   the blocks abov
11c10 65 2e 0a 20 20 2a 2a 20 46 72 65 65 20 74 68 65  e..  ** Free the
11c20 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
11c30 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
11c40 69 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20  ile..  ** Since 
11c50 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
11c60 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65   allocated there
11c70 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73   is no need to s
11c80 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67  et .  ** any Pag
11c90 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61  er.errMask varia
11ca0 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bles..  */.  if(
11cb0 20 21 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61   !pPager || !pPa
11cc0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
11cd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11ce0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
11cf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
11d00 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
11d10 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c  return ((rc==SQL
11d20 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e  ITE_OK)?SQLITE_N
11d30 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20  OMEM:rc);.  }.. 
11d40 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4f 50   PAGERTRACE3("OP
11d50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
11d60 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
11d70 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
11d80 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 49 4f 54  Filename);.  IOT
11d90 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
11da0 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  s\n", pPager, pP
11db0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
11dc0 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  )..  /* Fill in 
11dd0 50 61 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79  Pager.zDirectory
11de0 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70  [] */.  memcpy(p
11df0 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
11e00 79 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  y, pPager->zFile
11e10 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b  name, nPathname+
11e20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c  1);.  for(i=strl
11e30 65 6e 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  en(pPager->zDire
11e40 63 74 6f 72 79 29 3b 20 69 3e 30 20 26 26 20 70  ctory); i>0 && p
11e50 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
11e60 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d  y[i-1]!='/'; i--
11e70 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20  ){}.  if( i>0 ) 
11e80 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
11e90 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20  ry[i-1] = 0;..  
11ea0 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72  /* Fill in Pager
11eb0 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f 0a 20  .zJournal[] */. 
11ec0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
11ed0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
11ee0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  ->zFilename, nPa
11ef0 74 68 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70  thname);.  memcp
11f00 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
11f10 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
11f20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a  "-journal", 9);.
11f30 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  .  /* pPager->jo
11f40 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a  urnalOpen = 0; *
11f50 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  /.  pPager->useJ
11f60 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72  ournal = useJour
11f70 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20  nal && !memDb;. 
11f80 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
11f90 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b  ock = noReadlock
11fa0 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20   && readOnly;.  
11fb0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
11fc0 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
11fd0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
11fe0 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
11ff0 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
12000 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
12010 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
12020 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
12030 69 7a 65 20 3d 20 6e 44 65 66 61 75 6c 74 50 61  ize = nDefaultPa
12040 67 65 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ge;.  /* pPager-
12050 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
12060 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
12070 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
12080 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
12090 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
120a0 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
120b0 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78  00;.  pPager->mx
120c0 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
120d0 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
120e0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
120f0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
12100 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
12110 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28  ager->state == (
12120 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52  tempFile ? PAGER
12130 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47  _EXCLUSIVE : PAG
12140 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20  ER_UNLOCK) );.  
12150 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
12160 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
12170 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
12180 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
12190 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
121a0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
121b0 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
121c0 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
121d0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
121e0 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
121f0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
12200 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
12210 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
12220 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
12230 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20  e = tempFile; . 
12240 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
12250 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
12260 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
12270 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
12280 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
12290 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
122a0 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
122b0 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
122c0 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
122d0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
122e0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
122f0 31 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  1);.  pPager->sy
12300 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nc_flags = SQLIT
12310 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
12320 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
12330 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
12340 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
12350 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
12360 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
12370 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
12380 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45  ->nExtra = FORCE
12390 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72  _ALIGNMENT(nExtr
123a0 61 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61  a);.  assert(pPa
123b0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
123c0 73 7c 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70 46 69  s||memDb||tempFi
123d0 6c 65 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44  le);.  if( !memD
123e0 62 20 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74  b ){.    setSect
123f0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
12400 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
12410 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
12420 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65  0; */.  /* memse
12430 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
12440 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
12450 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
12460 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
12470 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er;.#ifdef SQLIT
12480 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
12490 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61  MANAGEMENT.  pPa
124a0 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20  ger->iInUseMM = 
124b0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e  0;.  pPager->iIn
124c0 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 69 66 28  UseDB = 0;.  if(
124d0 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73   !memDb ){.    s
124e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
124f0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
12500 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
12510 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
12520 4d 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  M2);.    sqlite3
12530 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
12540 65 78 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ex);.    pPager-
12550 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  >pNext = sqlite3
12560 50 61 67 65 72 4c 69 73 74 3b 0a 20 20 20 20 69  PagerList;.    i
12570 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  f( sqlite3PagerL
12580 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ist ){.      ass
12590 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
125a0 72 4c 69 73 74 2d 3e 70 50 72 65 76 3d 3d 30 20  rList->pPrev==0 
125b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
125c0 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76  PagerList->pPrev
125d0 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 7d   = pPager;.    }
125e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72  .    pPager->pPr
125f0 65 76 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ev = 0;.    sqli
12600 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70  te3PagerList = p
12610 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
12620 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
12630 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  utex);.  }.#endi
12640 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
12650 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
12660 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
12670 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ler function..*/
12680 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
12690 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
126a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
126b0 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
126c0 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50  syHandler){.  pP
126d0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
126e0 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  er = pBusyHandle
126f0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  r;.}../*.** Set 
12700 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
12710 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
12720 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
12730 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63   destructor is c
12740 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  alled.** when th
12750 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
12760 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72  t on each page r
12770 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68  eaches zero.  Th
12780 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e  e destructor can
12790 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
127a0 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74  lean up informat
127b0 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61  ion in the extra
127c0 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65   segment appende
127d0 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a  d to each page..
127e0 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75  **.** The destru
127f0 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c  ctor is not call
12800 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73  ed as a result s
12810 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
12820 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63  ().  .** Destruc
12830 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61  tors are only ca
12840 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  lled by sqlite3P
12850 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a  agerUnref()..*/.
12860 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
12870 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 50  rSetDestructor(P
12880 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
12890 69 64 20 28 2a 78 44 65 73 63 29 28 44 62 50 61  id (*xDesc)(DbPa
128a0 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  ge*,int)){.  pPa
128b0 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
128c0 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a   = xDesc;.}../*.
128d0 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69  ** Set the reini
128e0 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69  tializer for thi
128f0 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
12900 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
12910 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
12920 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
12930 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
12940 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73   in cache is res
12950 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
12960 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61  ginal.** value a
12970 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
12980 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63  rollback.  The c
12990 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69  allback gives hi
129a0 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a  gher-level code.
129b0 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ** an opportunit
129c0 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
129d0 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
129e0 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
129f0 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67   restored.** pag
12a00 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
12a10 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
12a20 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
12a30 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
12a40 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69  einit)(DbPage*,i
12a50 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
12a60 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
12a70 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
12a80 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  t the page size.
12a90 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77    Return the new
12aa0 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73   size.  If the s
12ab0 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a  uggest new page.
12ac0 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70  ** size is inapp
12ad0 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61  ropriate, then a
12ae0 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61  n alternative pa
12af0 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63  ge size is selec
12b00 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ted.** and retur
12b10 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
12b20 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
12b30 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
12b40 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29  r, int pageSize)
12b50 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  {.  assert( page
12b60 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
12b70 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
12b80 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
12b90 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
12ba0 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 20 26    if( pageSize &
12bb0 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  & !pPager->memDb
12bc0 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   && pPager->nRef
12bd0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65 72  ==0 ){.    pager
12be0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
12bf0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
12c00 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
12c10 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
12c20 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 73 65 74  ageSize;.    set
12c30 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
12c40 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61  r);.    pagerLea
12c50 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
12c60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
12c70 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
12c80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d  .    pPager->pTm
12c90 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
12ca0 5f 6d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65  _malloc(pageSize
12cb0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12cc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12cd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
12ce0 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
12cf0 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
12d00 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
12d10 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
12d20 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
12d30 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
12d40 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
12d50 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
12d60 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
12d70 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
12d80 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
12d90 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
12da0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
12db0 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
12dc0 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
12dd0 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
12de0 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
12df0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
12e00 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
12e10 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
12e20 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
12e30 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
12e40 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
12e50 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Page;.  }.  sqli
12e60 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
12e70 74 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  t(pPager);.  ret
12e80 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
12e90 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
12ea0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
12eb0 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
12ec0 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
12ed0 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
12ee0 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
12ef0 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
12f00 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
12f10 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
12f20 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
12f30 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
12f40 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
12f50 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
12f60 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
12f70 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
12f80 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
12f90 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
12fa0 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
12fb0 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
12fc0 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
12fd0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
12fe0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
12ff0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
13000 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
13010 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
13020 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
13030 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
13040 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
13050 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
13060 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
13070 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
13080 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
13090 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
130a0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
130b0 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
130c0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
130d0 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
130e0 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
130f0 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
13100 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
13110 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
13120 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
13130 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
13140 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
13150 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
13160 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
13170 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
13180 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
13190 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
131a0 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ts to. .**.** No
131b0 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
131c0 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74  is done. The rat
131d0 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69  ional for this i
131e0 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
131f0 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20  tion .** may be 
13200 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74  called even if t
13210 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
13220 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
13230 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a  n a header. In .
13240 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20 73  ** these cases s
13250 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 77  qlite3OsRead() w
13260 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ill return an er
13270 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68  ror, to which th
13280 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65  e correct .** re
13290 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72  sponse is to zer
132a0 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20  o the memory at 
132b0 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e  pDest and contin
132c0 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65  ue.  A real IO e
132d0 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72  rror .** will pr
132e0 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61  esumably recur a
132f0 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70 20  nd be picked up 
13300 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69  later (Todo: Thi
13310 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a  nk about this)..
13320 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
13330 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
13340 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
13350 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
13360 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
13370 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13380 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
13390 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
133a0 73 65 72 74 28 4d 45 4d 44 42 7c 7c 70 50 61 67  sert(MEMDB||pPag
133b0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
133c0 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ||pPager->tempFi
133d0 6c 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  le);.  if( pPage
133e0 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
133f0 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
13400 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
13410 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
13420 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13430 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
13440 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
13450 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13460 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
13470 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
13480 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13490 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
134a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
134b0 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
134c0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
134d0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
134e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
134f0 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a  * pPager. .**.**
13500 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   If the PENDING_
13510 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65  BYTE lies on the
13520 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61   page directly a
13530 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
13540 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  the.** file, the
13550 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  n consider this 
13560 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65  page part of the
13570 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65   file too. For e
13580 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45  xample, if.** PE
13590 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79  NDING_BYTE is by
135a0 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72  te 4096 (the fir
135b0 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20  st byte of page 
135c0 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  5) and the size 
135d0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  of the.** file i
135e0 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20  s 4096 bytes, 5 
135f0 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
13600 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74  ead of 4..*/.int
13610 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
13620 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
13630 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 20 3d  ager){.  i64 n =
13640 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
13650 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
13660 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
13670 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
13680 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
13690 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
136a0 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e  Size>=0 ){.    n
136b0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
136c0 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  e;.  } else {.  
136d0 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
136e0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
136f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
13700 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65  ;.    if( (pPage
13710 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29  r->fd->pMethods)
13720 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73  .     && (rc = s
13730 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
13740 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
13750 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
13760 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
13770 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
13780 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
13790 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30     }.    if( n>0
137a0 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61   && n<pPager->pa
137b0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
137c0 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  n = 1;.    }else
137d0 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61  {.      n /= pPa
137e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
137f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
13800 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
13810 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
13820 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
13830 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
13840 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e    if( n==(PENDIN
13850 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70  G_BYTE/pPager->p
13860 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  ageSize) ){.    
13870 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  n++;.  }.  if( n
13880 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
13890 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
138a0 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20  xPgno = n;.  }. 
138b0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23   return n;.}...#
138c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
138d0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a  IT_MEMORYDB./*.*
138e0 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74  * Clear a PgHist
138f0 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61  ory block.*/.sta
13900 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69  tic void clearHi
13910 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20  story(PgHistory 
13920 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pHist){.  sqlit
13930 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70  e3_free(pHist->p
13940 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  Orig);.  sqlite3
13950 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  _free(pHist->pSt
13960 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f  mt);.  pHist->pO
13970 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74  rig = 0;.  pHist
13980 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23  ->pStmt = 0;.}.#
13990 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65  else.#define cle
139a0 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e  arHistory(x).#en
139b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  dif../*.** Forwa
139c0 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
139d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
139e0 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29  cJournal(Pager*)
139f0 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  ;../*.** Unlink 
13a00 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61  pPg from it's ha
13a10 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73  sh chain. Also s
13a20 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  et the page numb
13a30 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63  er to 0 to indic
13a40 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ate.** that the 
13a50 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74  page is not part
13a60 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61   of any hash cha
13a70 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  in. This is requ
13a80 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65  ired because the
13a90 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
13aa0 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69  Movepage() routi
13ab0 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70  ne can leave a p
13ac0 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70  age in the .** p
13ad0 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72  NextFree/pPrevFr
13ae0 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  ee list that is 
13af0 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e  not a part of an
13b00 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f  y hash-chain..*/
13b10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
13b20 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67  inkHashChain(Pag
13b30 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
13b40 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
13b50 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  Pg->pgno==0 ){. 
13b60 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
13b70 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20  pNextHash==0 && 
13b80 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  pPg->pPrevHash==
13b90 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 );.    return;
13ba0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
13bb0 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
13bc0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
13bd0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
13be0 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d  ->pPrevHash;.  }
13bf0 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
13c00 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73  vHash ){.    ass
13c10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
13c20 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28  sh[pPg->pgno & (
13c30 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
13c40 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  ]!=pPg );.    pP
13c50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e  g->pPrevHash->pN
13c60 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
13c70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73  NextHash;.  }els
13c80 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70  e{.    int h = p
13c90 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67  Pg->pgno & (pPag
13ca0 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
13cb0 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
13cc0 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  h] = pPg->pNextH
13cd0 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d  ash;.  }.  if( M
13ce0 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61  EMDB ){.    clea
13cf0 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54  rHistory(PGHDR_T
13d00 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
13d10 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  er));.  }.  pPg-
13d20 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67  >pgno = 0;.  pPg
13d30 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
13d40 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
13d50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
13d60 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  k a page from th
13d70 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65  e free list (the
13d80 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
13d90 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30  es where nRef==0
13da0 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74  ).** and from it
13db0 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  s hash collision
13dc0 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   chain..*/.stati
13dd0 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67  c void unlinkPag
13de0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
13df0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
13e00 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
13e10 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69   /* Keep the pFi
13e20 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65  rstSynced pointe
13e30 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  r pointing at th
13e40 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e  e first synchron
13e50 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  ized page */.  i
13e60 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  f( pPg==pPager->
13e70 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
13e80 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70      PgHdr *p = p
13e90 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
13ea0 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
13eb0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20  ->needSync ){ p 
13ec0 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20  = p->pNextFree; 
13ed0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
13ee0 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
13ef0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
13f00 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
13f10 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  st */.  if( pPg-
13f20 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
13f30 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
13f40 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
13f50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
13f60 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
13f70 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  t( pPager->pFirs
13f80 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
13f90 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
13fa0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
13fb0 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
13fc0 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70  extFree ){.    p
13fd0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
13fe0 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
13ff0 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c  pPrevFree;.  }el
14000 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
14010 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70  pPager->pLast==p
14020 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
14030 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70  ->pLast = pPg->p
14040 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20  PrevFree;.  }.  
14050 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
14060 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
14070 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  = 0;..  /* Unlin
14080 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20  k from the pgno 
14090 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
140a0 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
140b0 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a  pPager, pPg);.}.
140c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
140d0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74  ine is used to t
140e0 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68  runcate the cach
140f0 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  e when a databas
14100 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65  e.** is truncate
14110 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68  d.  Drop from th
14120 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65  e cache all page
14130 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a  s whose pgno is.
14140 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  ** larger than p
14150 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e  Pager->dbSize an
14160 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65  d is unreference
14170 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  d..**.** Referen
14180 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72  ced pages larger
14190 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
141a0 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  Size are zeroed.
141b0 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  .**.** Actually,
141c0 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68   at the point th
141d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
141e0 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62  lled, it would b
141f0 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  e.** an error to
14200 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63   have a referenc
14210 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72 61  ed page.  But ra
14220 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65  ther than delete
14230 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e  .** that page an
14240 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 75  d guarantee a su
14250 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c  bsequent segfaul
14260 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74 74  t, it seems bett
14270 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74  er.** to zero it
14280 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77   and hope that w
14290 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65  e error out sane
142a0 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
142b0 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
142c0 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
142d0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
142e0 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a  *pPg;.  PgHdr **
142f0 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69  ppPg;.  int dbSi
14300 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
14310 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26  ize;..  ppPg = &
14320 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
14330 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70  while( (pPg = *p
14340 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  pPg)!=0 ){.    i
14350 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62  f( pPg->pgno<=db
14360 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70  Size ){.      pp
14370 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
14380 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  All;.    }else i
14390 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  f( pPg->nRef>0 )
143a0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
143b0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
143c0 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
143d0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
143e0 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
143f0 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tAll;.    }else{
14400 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70  .      *ppPg = p
14410 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
14420 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
14430 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70  FREE %p %d\n", p
14440 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
14450 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
14460 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
14470 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
14480 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61  ;.      unlinkPa
14490 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d  ge(pPg);.      m
144a0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
144b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
144c0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50  e(pPg);.      pP
144d0 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20  ager->nPage--;. 
144e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
144f0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
14500 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65  a lock on a file
14510 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  .  Invoke the bu
14520 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
14530 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75  he lock.** is cu
14540 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
14550 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75  lable.  Repeat u
14560 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
14570 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a  llback returns.*
14580 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  * false or until
14590 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
145a0 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
145b0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
145c0 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
145d0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
145e0 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
145f0 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  he lock..*/.stat
14600 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
14610 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
14620 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
14630 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
14640 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  ;..  /* The OS l
14650 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
14660 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
14670 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
14680 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
14690 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
146a0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
146b0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
146c0 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
146d0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
146e0 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
146f0 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
14700 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
14710 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
14720 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
14730 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
14740 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a  t be unknown */.
14750 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14760 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
14770 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  HARED || pPager-
14780 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d  >dbSize<0 || MEM
14790 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  DB );..  if( pPa
147a0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
147b0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
147c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
147d0 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
147e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
147f0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
14800 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  d, locktype);.  
14810 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
14820 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c  LITE_BUSY && sql
14830 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
14840 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
14850 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20  usyHandler) );. 
14860 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
14880 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f  ager->state = lo
14890 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
148a0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
148b0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
148c0 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
148d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
148e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
148f0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
14900 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
14910 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
14920 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
14930 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  rTruncate(Pager 
14940 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
14950 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
14960 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14970 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
14980 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29  HARED || MEMDB )
14990 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
149a0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
149b0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
149c0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
149d0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
149e0 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Code;.    return
149f0 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
14a00 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
14a10 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
14a20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
14a30 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
14a40 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
14a50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
14a60 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72  nPage;.    pager
14a70 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
14a80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
14a90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14aa0 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28   }.  pagerEnter(
14ab0 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
14ac0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
14ad0 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  er);.  pagerLeav
14ae0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
14af0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14b00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
14b10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
14b20 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
14b30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
14b40 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
14b50 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45 6e  ng. */.  pagerEn
14b60 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ter(pPager);.  r
14b70 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
14b80 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
14b90 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
14ba0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
14bb0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
14bc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14bd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
14be0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
14bf0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
14c00 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
14c10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
14c20 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
14c30 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
14c40 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
14c50 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
14c60 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
14c70 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
14c80 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
14c90 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
14ca0 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
14cb0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
14cc0 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
14cd0 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
14ce0 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
14cf0 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
14d00 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
14d10 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
14d20 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
14d30 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
14d40 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
14d50 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
14d60 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
14d70 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
14d80 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
14d90 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
14da0 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
14db0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
14dc0 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
14dd0 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
14de0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
14df0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
14e00 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
14e10 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
14e20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
14e30 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
14e40 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
14e50 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
14e60 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
14e70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
14e80 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
14e90 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66  *pPager){.#ifdef
14ea0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
14eb0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
14ec0 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b  .  if( !MEMDB ){
14ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
14ee0 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69  ex *mutex = sqli
14ef0 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
14f00 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
14f10 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 73  TIC_MEM2);.    s
14f20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
14f30 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 69  er(mutex);.    i
14f40 66 28 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76  f( pPager->pPrev
14f50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
14f60 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
14f70 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
14f80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14f90 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73   sqlite3PagerLis
14fa0 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  t = pPager->pNex
14fb0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
14fc0 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 29   pPager->pNext )
14fd0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
14fe0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
14ff0 50 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20 20  Pager->pPrev;.  
15000 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
15010 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
15020 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  x);.  }.#endif..
15030 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
15040 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
15050 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  .  pPager->errCo
15060 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  de = 0;.  pPager
15070 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
15080 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73  = 0;.  pager_res
15090 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  et(pPager);.  pa
150a0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
150b0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
150c0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
150d0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
150e0 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f  PAGERTRACE2("CLO
150f0 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
15100 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f  D(pPager));.  IO
15110 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
15120 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
15130 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15140 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67  errCode || (pPag
15150 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
15160 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  =0 && pPager->st
15170 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20  mtOpen==0) );.  
15180 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
15190 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  nalOpen ){.    s
151a0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
151b0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a  ager->jfd);.  }.
151c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
151d0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
151e0 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  l);.  if( pPager
151f0 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
15200 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
15210 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  (pPager->stfd);.
15220 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
15230 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
15240 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
15250 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
15260 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
15270 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
15280 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
15290 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
152a0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
152b0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
152c0 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c  ** }.  */..  sql
152d0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
152e0 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69  ->aHash);.  sqli
152f0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
15300 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73  >pTmpSpace);.  s
15310 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
15320 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
15330 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
15340 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
15350 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
15360 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
15370 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
15380 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
15390 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
153a0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
153b0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
153c0 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  Page *p){.  retu
153d0 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65  rn p->pgno;.}.#e
153e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
153f0 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
15400 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
15410 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
15420 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
15430 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
15440 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
15450 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
15460 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
15470 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
15480 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
15490 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
154a0 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
154b0 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
154c0 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
154d0 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
154e0 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
154f0 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
15500 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
15510 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
15520 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
15530 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
15540 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
15550 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
15560 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
15570 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15580 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
15590 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
155a0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
155b0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
155c0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
155d0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
155e0 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ove it. */.    i
155f0 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61  f( pPg==pPg->pPa
15600 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
15610 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  d ){.      PgHdr
15620 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
15630 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c  Free;.      whil
15640 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
15650 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
15660 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20  extFree; }.     
15670 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
15680 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
15690 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
156a0 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
156b0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
156c0 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
156d0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
156e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
156f0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
15700 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
15710 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  extFree;.    }. 
15720 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
15730 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  tFree ){.      p
15740 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
15750 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
15760 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
15770 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
15780 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d  >pPager->pLast =
15790 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
157a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
157b0 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
157c0 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b    }.  pPg->nRef+
157d0 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  +;.  REFINFO(pPg
157e0 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
157f0 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69  TE_DEBUG.  stati
15800 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28  c void page_ref(
15810 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20  PgHdr *pPg){.   
15820 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
15830 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65  0 ){.      _page
15840 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d  _ref(pPg);.    }
15850 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
15860 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52  >nRef++;.      R
15870 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
15880 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64   }.  }.#else.# d
15890 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50  efine page_ref(P
158a0 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d  )   ((P)->nRef==
158b0 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28  0?_page_ref(P):(
158c0 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b  void)(P)->nRef++
158d0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
158e0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
158f0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
15900 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69  r a page.  The i
15910 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a  nput pointer is.
15920 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
15930 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  o the page data.
15940 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
15950 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
15960 70 50 67 29 7b 0a 20 20 70 61 67 65 72 45 6e 74  pPg){.  pagerEnt
15970 65 72 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b  er(pPg->pPager);
15980 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
15990 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
159a0 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 72  Pg->pPager);.  r
159b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
159c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
159d0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
159e0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
159f0 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
15a00 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
15a10 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
15a20 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
15a30 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
15a40 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
15a50 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20  of the.** disk. 
15a60 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
15a70 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72  to modify the or
15a80 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
15a90 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72  file until after
15aa0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
15ab0 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
15ac0 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61    If the origina
15ad0 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f  l database is mo
15ae0 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a  dified before.**
15af0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
15b00 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77  synced and a pow
15b10 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
15b20 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  s, the unsynced 
15b30 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20  journal.** data 
15b40 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e  would be lost an
15b50 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e  d we would be un
15b60 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  able to complete
15b70 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a  ly rollback the.
15b80 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
15b90 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63  ges.  Database c
15ba0 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20  orruption would 
15bb0 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  occur..** .** Th
15bc0 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
15bd0 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63  updates the nRec
15be0 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65   field in the he
15bf0 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
15c00 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d  nal..** (See com
15c10 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67  ments on the pag
15c20 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
15c30 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
15c40 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
15c50 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e  .).** If the syn
15c60 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20  c mode is FULL, 
15c70 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f  two syncs will o
15c80 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65  ccur.  First the
15c90 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a   whole journal.*
15ca0 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65  * is synced, the
15cb0 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
15cc0 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65   is updated, the
15cd0 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20  n a second sync 
15ce0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  occurs..**.** Fo
15cf0 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
15d00 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74  bases, we do not
15d10 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20   care if we are 
15d20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
15d30 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65  .** after a powe
15d40 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f  r failure, so no
15d50 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
15d60 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50  .** If the IOCAP
15d70 5f 53 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67  _SEQUENTIAL flag
15d80 20 69 73 20 73 65 74 20 66 6f 72 20 74 68 65 20   is set for the 
15d90 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
15da0 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65   on which.** the
15db0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 6f   database is sto
15dc0 72 65 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63  red, then OsSync
15dd0 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
15de0 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
15df0 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68  l.** file. In th
15e00 69 73 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74  is case all that
15e10 20 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20   is required is 
15e20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 6e 52  to update the nR
15e30 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74  ec field in.** t
15e40 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
15e50 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
15e60 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
15e70 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
15e80 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
15e90 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
15ea0 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
15eb0 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
15ec0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
15ed0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
15ee0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15ef0 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 53 79  TE_OK;...  /* Sy
15f00 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  nc the journal b
15f10 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
15f20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
15f30 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67  e.  ** (assuming
15f40 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72   there is a jour
15f50 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73  nal and it needs
15f60 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a   to be synced.).
15f70 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
15f80 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  r->needSync ){. 
15f90 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
15fa0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
15fb0 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
15fc0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
15fd0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
15fe0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73  r->fd);.      as
15ff0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
16000 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20  urnalOpen );..  
16010 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21      /* assert( !
16020 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
16030 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68  ; // noSync migh
16040 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63  t be set if sync
16050 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a  hronous.      **
16060 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20   was turned off 
16070 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61  after the transa
16080 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
16090 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20  d.  Ticket #615 
160a0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
160b0 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  G.      {.      
160c0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
160d0 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  he pPager->nRec 
160e0 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b  counter we are k
160f0 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20  eeping agrees.  
16100 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68        ** with th
16110 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  e nRec computed 
16120 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
16130 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
16140 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
16150 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20        i64 jSz;. 
16160 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16170 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
16180 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29  ager->jfd, &jSz)
16190 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
161a0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
161b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
161c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
161d0 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20  Off==jSz );.    
161e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
161f0 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
16200 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
16210 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
16220 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
16230 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
16240 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
16250 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
16260 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
16270 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
16280 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
16290 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
162a0 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
162b0 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
162c0 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
162d0 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
162e0 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
162f0 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
16300 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
16310 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
16320 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
16330 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
16340 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
16350 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
16360 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
16370 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
16380 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
16390 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
163a0 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
163b0 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
163c0 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
163d0 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
163e0 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
163f0 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
16400 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
16410 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
16420 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
16430 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
16440 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
16450 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
16460 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
16470 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
16480 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e  .        i64 jrn
16490 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66  lOff;.        if
164a0 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
164b0 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
164c0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
164d0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
164e0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
164f0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
16500 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
16510 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
16520 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
16530 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
16540 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
16550 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
16560 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
16570 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
16580 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
16590 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
165a0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
165b0 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d         jrnlOff =
165c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
165d0 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
165e0 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20  urnalMagic);.   
165f0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
16600 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
16610 22 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f  ", pPager, jrnlO
16620 66 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20  ff, 4));.       
16630 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
16640 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
16650 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  rnlOff, pPager->
16660 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69  nRec);.        i
16670 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
16680 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
16690 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
166a0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
166b0 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
166c0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
166d0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
166e0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
166f0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49  ger));.        I
16700 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
16710 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
16720 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16730 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
16740 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
16750 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20  ync_flags| .    
16760 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
16770 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54  ync_flags==SQLIT
16780 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
16790 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
167a0 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
167b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
167c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
167d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
167e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
167f0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
16800 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
16810 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
16820 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79  Erase the needSy
16830 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65  nc flag from eve
16840 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ry page..    */.
16850 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
16860 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
16870 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
16880 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
16890 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
168a0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
168b0 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
168c0 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d  ger->pFirst;.  }
168d0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
168e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67  .  /* If the Pag
168f0 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
16900 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74   is clear then t
16910 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
16920 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74  c.  ** flag must
16930 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66   also be clear f
16940 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56  or all pages.  V
16950 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a  erify that this.
16960 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69    ** invariant i
16970 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65  s true..  */.  e
16980 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67  lse{.    for(pPg
16990 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
169a0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
169b0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73  xtAll){.      as
169c0 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
169d0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  ync==0 );.    }.
169e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
169f0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
16a00 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
16a10 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
16a20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16a30 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20  /*.** Merge two 
16a40 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73 20 63  lists of pages c
16a50 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
16a60 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f  ty and in pgno o
16a70 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  rder..** Do not 
16a80 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65 20  both fixing the 
16a90 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74  pPrevDirty point
16aa0 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ers..*/.static P
16ab0 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65  gHdr *merge_page
16ac0 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20  list(PgHdr *pA, 
16ad0 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67  PgHdr *pB){.  Pg
16ae0 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61  Hdr result, *pTa
16af0 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72  il;.  pTail = &r
16b00 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20  esult;.  while( 
16b10 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20  pA && pB ){.    
16b20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d  if( pA->pgno<pB-
16b30 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70  >pgno ){.      p
16b40 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
16b50 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d  A;.      pTail =
16b60 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20   pA;.      pA = 
16b70 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  pA->pDirty;.    
16b80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61  }else{.      pTa
16b90 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b  il->pDirty = pB;
16ba0 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70  .      pTail = p
16bb0 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42  B;.      pB = pB
16bc0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
16bd0 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a    }.  if( pA ){.
16be0 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
16bf0 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20  y = pA;.  }else 
16c00 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54  if( pB ){.    pT
16c10 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42  ail->pDirty = pB
16c20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
16c30 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30  Tail->pDirty = 0
16c40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
16c50 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a  esult.pDirty;.}.
16c60 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20  ./*.** Sort the 
16c70 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  list of pages in
16c80 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
16c90 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73   by pgno.  Pages
16ca0 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65   are.** connecte
16cb0 64 20 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e  d by pDirty poin
16cc0 74 65 72 73 2e 20 20 54 68 65 20 70 50 72 65 76  ters.  The pPrev
16cd0 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61  Dirty pointers a
16ce0 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20  re.** corrupted 
16cf0 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f  by this sort..*/
16d00 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f  .#define N_SORT_
16d10 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a  BUCKET_ALLOC 25.
16d20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
16d30 55 43 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23  UCKET       25.#
16d40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
16d50 54 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  T.  int sqlite3_
16d60 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
16d70 6b 65 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65  ket = 0;.  #unde
16d80 66 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a  f N_SORT_BUCKET.
16d90 20 20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54    #define N_SORT
16da0 5f 42 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71  _BUCKET \.   (sq
16db0 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
16dc0 72 74 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65  rt_bucket?sqlite
16dd0 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62  3_pager_n_sort_b
16de0 75 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43  ucket:N_SORT_BUC
16df0 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69  KET_ALLOC).#endi
16e00 66 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  f.static PgHdr *
16e10 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67  sort_pagelist(Pg
16e20 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48  Hdr *pIn){.  PgH
16e30 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43  dr *a[N_SORT_BUC
16e40 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a  KET_ALLOC], *p;.
16e50 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65    int i;.  memse
16e60 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  t(a, 0, sizeof(a
16e70 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e  ));.  while( pIn
16e80 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b   ){.    p = pIn;
16e90 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44  .    pIn = p->pD
16ea0 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69  irty;.    p->pDi
16eb0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  rty = 0;.    for
16ec0 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42  (i=0; i<N_SORT_B
16ed0 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20  UCKET-1; i++){. 
16ee0 20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30       if( a[i]==0
16ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d   ){.        a[i]
16f00 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72   = p;.        br
16f10 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
16f20 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65  {.        p = me
16f30 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69  rge_pagelist(a[i
16f40 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61  ], p);.        a
16f50 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
16f60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
16f70 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d  ==N_SORT_BUCKET-
16f80 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f  1 ){.      /* Co
16f90 76 65 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68  verage: To get h
16fa0 65 72 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20  ere, there need 
16fb0 74 6f 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f  to be 2^(N_SORT_
16fc0 42 55 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a  BUCKET) .      *
16fd0 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  * elements in th
16fe0 65 20 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68  e input list. Th
16ff0 69 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20  is is possible, 
17000 62 75 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e  but impractical.
17010 0a 20 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e  .      ** Testin
17020 67 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74  g this line is t
17030 68 65 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62  he point of glob
17040 61 6c 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  al variable.    
17050 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67    ** sqlite3_pag
17060 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
17070 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17080 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61   a[i] = merge_pa
17090 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b  gelist(a[i], p);
170a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d  .    }.  }.  p =
170b0 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31   a[0];.  for(i=1
170c0 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ; i<N_SORT_BUCKE
170d0 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  T; i++){.    p =
170e0 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
170f0 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  p, a[i]);.  }.  
17100 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
17110 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20  ** Given a list 
17120 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63  of pages (connec
17130 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72  ted by the PgHdr
17140 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29  .pDirty pointer)
17150 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20   write.** every 
17160 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
17170 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  es out to the da
17180 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
17190 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a  mark them all.**
171a0 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74   as clean..*/.st
171b0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
171c0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67  rite_pagelist(Pg
171d0 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50  Hdr *pList){.  P
171e0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
171f0 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 6e 74 20  PgHdr *p;.  int 
17200 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
17210 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
17220 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
17230 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
17240 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
17250 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
17260 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
17270 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
17280 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
17290 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
172a0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
172b0 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
172c0 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
172d0 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
172e0 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f  s to sqlite3OsLo
172f0 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  ck() are no-ops.
17300 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
17310 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
17320 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
17330 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
17340 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
17350 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
17360 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
17370 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
17380 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
17390 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
173a0 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
173b0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
173c0 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
173d0 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
173e0 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
173f0 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
17400 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
17410 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
17420 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
17430 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
17440 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
17450 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
17460 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
17470 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
17480 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
17490 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
174a0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
174b0 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
174c0 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
174d0 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
174e0 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
174f0 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
17500 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
17510 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
17520 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
17530 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
17540 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
17550 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
17560 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
17570 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
17580 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
17590 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
175a0 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
175b0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
175c0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
175d0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
175e0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  E_LOCK);.  if( r
175f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17600 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17610 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f   }..  pList = so
17620 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73  rt_pagelist(pLis
17630 74 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73  t);.  for(p=pLis
17640 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
17650 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
17660 70 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  p->dirty );.    
17670 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
17680 7d 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  }.  while( pList
17690 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   ){..    /* If t
176a0 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  he file has not 
176b0 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
176c0 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f   open it now. */
176d0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
176e0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
176f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  {.      assert(p
17700 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
17710 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
17720 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d  ite3PagerOpentem
17730 70 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  p(pPager->pVfs, 
17740 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
17750 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
17760 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
17770 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
17780 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
17790 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
177a0 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
177b0 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
177c0 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
177d0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
177e0 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
177f0 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
17800 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
17810 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
17820 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
17830 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
17840 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
17850 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
17860 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
17870 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
17880 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
17890 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
178a0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
178b0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
178c0 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70  fset = (pList->p
178d0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
178e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
178f0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
17900 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
17910 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
17920 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
17930 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41  no, 6);.      PA
17940 47 45 52 54 52 41 43 45 34 28 22 53 54 4f 52 45  GERTRACE4("STORE
17950 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
17960 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
17970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
17980 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
17990 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65  List->pgno, page
179a0 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
179b0 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
179c0 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
179d0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73  n", pPager, pLis
179e0 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  t->pgno));.     
179f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
17a00 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
17a10 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
17a20 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
17a30 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
17a40 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
17a50 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
17a60 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
17a70 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
17a80 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
17a90 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  ist->pgno==1 ){.
17aa0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
17ab0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
17ac0 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
17ad0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
17ae0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
17af0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
17b00 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
17b10 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
17b20 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
17b30 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
17b40 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
17b50 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
17b60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
17b70 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
17b80 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
17b90 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
17ba0 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
17bb0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
17bc0 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
17bd0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
17be0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
17bf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17c00 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
17c10 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
17c20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
17c30 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
17c40 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
17c50 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
17c60 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
17c70 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
17c80 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
17c90 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
17ca0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
17cb0 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
17cc0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
17cd0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
17ce0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
17cf0 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
17d00 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
17d10 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
17d20 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
17d30 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
17d40 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
17d50 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
17d60 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
17d70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
17d80 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
17d90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17da0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
17db0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
17dc0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
17dd0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
17de0 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
17df0 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
17e00 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
17e10 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
17e20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
17e30 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
17e40 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
17e50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
17e60 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
17e70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
17e80 66 73 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  fs;.  if( !pPage
17e90 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20  r->useJournal ) 
17ea0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
17eb0 21 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73  !sqlite3OsAccess
17ec0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
17ed0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
17ee0 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20 29  ACCESS_EXISTS) )
17ef0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
17f00 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
17f10 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
17f20 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29  Lock(pPager->fd)
17f30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
17f40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
17f50 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
17f60 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  t(pPager)==0 ){.
17f70 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
17f80 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
17f90 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
17fa0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
17fc0 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
17fd0 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20  * Try to find a 
17fe0 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
17ff0 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  e that can be re
18000 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  cycled. .**.** T
18010 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
18020 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
18030 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ERR, SQLITE_FULL
18040 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49   or SQLITE_OK. I
18050 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73  t .** does not s
18060 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65  et the pPager->e
18070 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
18080 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
18090 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67  ager_recycle(Pag
180a0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
180b0 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a  syncOk, PgHdr **
180c0 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20 2a  ppPg){.  PgHdr *
180d0 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30  pPg;.  *ppPg = 0
180e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 21 4d 45 4d  ;..  assert(!MEM
180f0 44 42 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  DB);..  /* Find 
18100 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
18110 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74  e.  Try to locat
18120 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  e a page that do
18130 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75  es not.  ** requ
18140 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20  ire us to do an 
18150 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a  fsync() on the j
18160 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70  ournal..  */.  p
18170 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
18180 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a  rstSynced;..  /*
18190 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74   If we could not
181a0 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61   find a page tha
181b0 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
181c0 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20  re an fsync().  
181d0 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ** on the journa
181e0 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e  l file then fsyn
181f0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
18200 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20  le.  This is a. 
18210 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70   ** very slow op
18220 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77  eration, so we w
18230 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69  ork hard to avoi
18240 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74  d it.  But somet
18250 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e  imes.  ** it can
18260 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20  't be helped..  
18270 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  */.  if( pPg==0 
18280 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
18290 74 20 26 26 20 73 79 6e 63 4f 6b 20 26 26 20 21  t && syncOk && !
182a0 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e 74 20  MEMDB){.    int 
182b0 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
182c0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
182d0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
182e0 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  ;.    int rc = s
182f0 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
18300 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
18310 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
18320 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
18330 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
18340 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
18350 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
18360 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
18370 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c     /* If in full
18380 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74  -sync mode, writ
18390 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  e a new journal 
183a0 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a  header into the.
183b0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
183c0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64   file. This is d
183d0 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65  one to avoid eve
183e0 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f  r modifying a jo
183f0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68  urnal.      ** h
18400 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e  eader that is in
18410 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f  volved in the ro
18420 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20  llback of pages 
18430 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20  that have.      
18440 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
18450 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
18460 61 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65  atabase (in case
18470 20 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20   the header is. 
18480 20 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20       ** trashed 
18490 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  when the nRec fi
184a0 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e  eld is updated).
184b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
184c0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
184d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
184e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
184f0 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20  ff > 0 );.      
18500 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18510 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a  doNotSync==0 );.
18520 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
18530 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
18540 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
18550 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
18560 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18570 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20  }.    }.    pPg 
18580 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
18590 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d  ;.  }.  if( pPg=
185a0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
185b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
185c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
185d0 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
185e0 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
185f0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
18600 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69  file if it is di
18610 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rty..  */.  if( 
18620 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
18630 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
18640 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
18650 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61  ync==0 );.    ma
18660 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
18670 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
18680 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
18690 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
186a0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
186b0 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20  list( pPg );.   
186c0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
186d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
186e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
186f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18700 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
18710 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a  Pg->dirty==0 );.
18720 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
18730 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69  e we are recycli
18740 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ng is marked as 
18750 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20  alwaysRollback, 
18760 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68  then.  ** set th
18770 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52  e global alwaysR
18780 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68  ollback flag, th
18790 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  us disabling the
187a0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
187b0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
187c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
187d0 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  r the rest of th
187e0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
187f0 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73    ** It is neces
18800 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20  sary to do this 
18810 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
18820 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
18830 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68  llback.  ** migh
18840 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74  t be reloaded at
18850 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75   a later time bu
18860 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  t at that point 
18870 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65  we won't remembe
18880 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77  r.  ** that is w
18890 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  as marked always
188a0 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20  Rollback.  This 
188b0 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70  means that all p
188c0 61 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62  ages must.  ** b
188d0 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61  e marked as alwa
188e0 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ysRollback from 
188f0 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a  here on out..  *
18900 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77  /.  if( pPg->alw
18910 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20  aysRollback ){. 
18920 20 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57     IOTRACE(("ALW
18930 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c  AYS_ROLLBACK %p\
18940 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
18950 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
18960 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d  ollback = 1;.  }
18970 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68  ..  /* Unlink th
18980 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20  e old page from 
18990 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e  the free list an
189a0 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  d the hash table
189b0 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61  .  */.  unlinkPa
189c0 67 65 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72  ge(pPg);.  asser
189d0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  t( pPg->pgno==0 
189e0 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50  );..  *ppPg = pP
189f0 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
18a00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
18a10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
18a20 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
18a30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
18a40 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
18a50 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f  o free superfluo
18a60 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  us dynamically a
18a70 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a  llocated memory.
18a80 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20 70  ** held by the p
18a90 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d  ager system. Mem
18aa0 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e  ory in use by an
18ab0 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20 61  y SQLite pager a
18ac0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74  llocated.** by t
18ad0 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
18ae0 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65 33  d may be sqlite3
18af0 5f 66 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a  _free()ed..**.**
18b00 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d   nReq is the num
18b10 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
18b20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e  memory required.
18b30 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20   Once this much 
18b40 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65  has.** been rele
18b50 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69  ased, the functi
18b60 6f 6e 20 72 65 74 75 72 6e 73 2e 20 54 68 65 20  on returns. The 
18b70 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
18b80 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
18b90 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66   .** of bytes of
18ba0 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64   memory released
18bb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18bc0 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f  PagerReleaseMemo
18bd0 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20  ry(int nReq){.  
18be0 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20  int nReleased = 
18bf0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  0;          /* B
18c00 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72  ytes of memory r
18c10 65 6c 65 61 73 65 64 20 73 6f 20 66 61 72 20 2a  eleased so far *
18c20 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
18c30 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20  x *mutex;       
18c40 2f 2a 20 54 68 65 20 4d 45 4d 32 20 6d 75 74 65  /* The MEM2 mute
18c50 78 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50  x */.  Pager *pP
18c60 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
18c70 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
18c80 67 20 6f 76 65 72 20 70 61 67 65 72 73 20 2a 2f  g over pagers */
18c90 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18cb0 2a 20 50 61 73 73 65 73 20 6f 76 65 72 20 70 61  * Passes over pa
18cc0 67 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63  gers */..  /* Ac
18cd0 71 75 69 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  quire the memory
18ce0 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 6d 75 74 65  -management mute
18cf0 78 0a 20 20 2a 2f 0a 20 20 6d 75 74 65 78 20 3d  x.  */.  mutex =
18d00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
18d10 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
18d20 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a  X_STATIC_MEM2);.
18d30 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
18d40 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 0a 20  enter(mutex);.. 
18d50 20 2f 2a 20 53 69 67 6e 61 6c 20 61 6c 6c 20 64   /* Signal all d
18d60 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18d70 6f 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  ons that memory 
18d80 6d 61 6e 61 67 65 6d 65 6e 74 20 77 61 6e 74 73  management wants
18d90 0a 20 20 2a 2a 20 74 6f 20 68 61 76 65 20 61 63  .  ** to have ac
18da0 63 65 73 73 20 74 6f 20 74 68 65 20 70 61 67 65  cess to the page
18db0 72 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  rs..  */.  for(p
18dc0 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67  Pager=sqlite3Pag
18dd0 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20  erList; pPager; 
18de0 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70  pPager=pPager->p
18df0 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67  Next){.     pPag
18e00 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 31  er->iInUseMM = 1
18e10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74 65  ;.  }..  /* Oute
18e20 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73 20  rmost loop runs 
18e30 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f 20  for at most two 
18e40 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72 73  iterations. Firs
18e50 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a 20  t iteration we. 
18e60 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64 20   ** try to find 
18e70 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e 20  memory that can 
18e80 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74 68  be released with
18e90 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e  out calling fsyn
18ea0 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a 2a  c(). Second.  **
18eb0 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69 63   iteration (whic
18ec0 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20 74  h only runs if t
18ed0 68 65 20 66 69 72 73 74 20 66 61 69 6c 65 64 20  he first failed 
18ee0 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79 74  to free nReq byt
18ef0 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72  es of.  ** memor
18f00 79 29 20 69 73 20 70 65 72 6d 69 74 74 65 64 20  y) is permitted 
18f10 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29 2e  to call fsync().
18f20 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75 72   This is of cour
18f30 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20 20  se much more .  
18f40 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20 20  ** expensive..  
18f50 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
18f60 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f  =1; i++){..    /
18f70 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
18f80 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20 70 61  ll the SQLite pa
18f90 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74  gers opened by t
18fa0 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
18fb0 64 2e 20 2a 2f 0a 20 20 20 20 50 61 67 65 72 20  d. */.    Pager 
18fc0 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
18fd0 33 50 61 67 65 72 4c 69 73 74 3b 0a 20 20 20 20  3PagerList;.    
18fe0 66 6f 72 28 20 3b 20 70 50 61 67 65 72 20 26 26  for( ; pPager &&
18ff0 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c   (nReq<0 || nRel
19000 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 50 61  eased<nReq); pPa
19010 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78  ger=pPager->pNex
19020 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20  t){.      PgHdr 
19030 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pPg;.      int 
19040 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19050 0a 20 20 20 20 20 20 2f 2a 20 49 6e 2d 6d 65 6d  .      /* In-mem
19060 6f 72 79 20 64 61 74 61 62 61 73 65 73 20 73 68  ory databases sh
19070 6f 75 6c 64 20 6e 6f 74 20 61 70 70 65 61 72 20  ould not appear 
19080 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6c 69 73  on the pager lis
19090 74 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  t */.      asser
190a0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20  t( !MEMDB );..  
190b0 20 20 20 20 2f 2a 20 53 6b 69 70 20 70 61 67 65      /* Skip page
190c0 72 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  rs that are curr
190d0 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 62 79 20  ently in use by 
190e0 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
190f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
19100 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 20 29  ager->iInUseDB )
19110 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
19120 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 70 61    /* For each pa
19130 67 65 72 2c 20 74 72 79 20 74 6f 20 66 72 65 65  ger, try to free
19140 20 61 73 20 6d 61 6e 79 20 70 61 67 65 73 20 61   as many pages a
19150 73 20 70 6f 73 73 69 62 6c 65 20 28 77 69 74 68  s possible (with
19160 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 61  out .      ** ca
19170 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 20 69 66  lling fsync() if
19180 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
19190 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
191a0 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a 20  the outermost . 
191b0 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20       ** loop).. 
191c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68       */.      wh
191d0 69 6c 65 28 20 28 6e 52 65 71 3c 30 20 7c 7c 20  ile( (nReq<0 || 
191e0 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 20  nReleased<nReq) 
191f0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
19200 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
19210 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
19220 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 29  Pager, i, &pPg))
19230 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
19240 20 70 50 67 0a 20 20 20 20 20 20 29 20 7b 0a 20   pPg.      ) {. 
19250 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20         /* We've 
19260 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20  found a page to 
19270 66 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f  free. At this po
19280 69 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73  int the page has
19290 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 2a   been .        *
192a0 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  * removed from t
192b0 68 65 20 70 61 67 65 20 68 61 73 68 2d 74 61 62  he page hash-tab
192c0 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  le, free-list an
192d0 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20  d synced-list . 
192e0 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73         ** (pFirs
192f0 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20  tSynced). It is 
19300 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c  still in the all
19310 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69   pages (pAll) li
19320 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  st. .        ** 
19330 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  Remove it from t
19340 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20  his list before 
19350 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 20  freeing..       
19360 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
19370 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50  odo: Check the P
19380 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20  ager.pStmt list 
19390 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
193a0 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20  s is Ok. It .   
193b0 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
193c0 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20   is though..    
193d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
193e0 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  gHdr *pTmp;.    
193f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 20      assert( pPg 
19400 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
19410 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  Pg==pPager->pAll
19420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70   ){.           p
19430 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50  Pager->pAll = pP
19440 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
19450 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19460 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d        for( pTmp=
19470 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54  pPager->pAll; pT
19480 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50  mp->pNextAll!=pP
19490 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  g; pTmp=pTmp->pN
194a0 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20  extAll ){}.     
194b0 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74       pTmp->pNext
194c0 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
194d0 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  All;.        }. 
194e0 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64         nReleased
194f0 20 2b 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20   += (.          
19500 20 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b    sizeof(*pPg) +
19510 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19520 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2b 20  e.            + 
19530 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50  sizeof(u32) + pP
19540 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20  ager->nExtra.   
19550 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42           + MEMDB
19560 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72  *sizeof(PgHistor
19570 79 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  y) .        );. 
19580 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
19590 22 50 47 46 52 45 45 20 25 70 20 25 64 20 2a 5c  "PGFREE %p %d *\
195a0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
195b0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20  >pgno));.       
195c0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
195d0 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65  te3_pager_pgfree
195e0 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
195f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
19600 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  g);.      }..   
19610 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19630 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  /* An error occu
19640 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
19650 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
19660 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20  se file or .    
19670 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69      ** journal i
19680 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  n pager_recycle(
19690 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  ). The error is 
196a0 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20  not returned to 
196b0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
196c0 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66  caller of this f
196d0 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  unction. Instead
196e0 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
196f0 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
19700 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  ..        ** The
19710 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
19720 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
19730 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69  ser (or users, i
19740 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20  n the case .    
19750 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72      ** of a shar
19760 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20  ed pager cache) 
19770 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72  of the pager for
19780 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72   which the error
19790 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20   occured..      
197a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
197b0 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 20 20  ert(.           
197c0 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49   (rc&0xff)==SQLI
197d0 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20  TE_IOERR ||.    
197e0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
197f0 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
19800 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
19810 45 5f 42 55 53 59 0a 20 20 20 20 20 20 20 20 29  E_BUSY.        )
19820 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
19830 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
19840 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
19850 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  );.        pager
19860 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
19870 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
19880 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  }.  }..  /* Clea
19890 72 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e  r the memory man
198a0 61 67 65 6d 65 6e 74 20 66 6c 61 67 73 20 61 6e  agement flags an
198b0 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 6d 75  d release the mu
198c0 74 65 78 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  tex.  */.  for(p
198d0 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67  Pager=sqlite3Pag
198e0 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20  erList; pPager; 
198f0 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70  pPager=pPager->p
19900 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67  Next){.     pPag
19910 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30  er->iInUseMM = 0
19920 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
19930 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
19940 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e  x);..  /* Return
19950 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19960 79 74 65 73 20 72 65 6c 65 61 73 65 64 0a 20 20  ytes released.  
19970 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c  */.  return nRel
19980 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20  eased;.}.#endif 
19990 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
199a0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
199b0 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  NT */../*.** Rea
199c0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
199d0 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66   page pPg out of
199e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
199f0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
19a00 74 20 72 65 61 64 44 62 50 61 67 65 28 50 61 67  t readDbPage(Pag
19a10 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
19a20 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  r *pPg, Pgno pgn
19a30 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
19a40 69 36 34 20 6f 66 66 73 65 74 3b 0a 20 20 61 73  i64 offset;.  as
19a50 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29  sert( MEMDB==0 )
19a60 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
19a70 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
19a80 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
19a90 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  e);.  if( !pPage
19aa0 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
19ab0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
19ac0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
19ad0 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66  _READ;.  }.  off
19ae0 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
19af0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
19b00 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Size;.  rc = sql
19b10 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
19b20 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f  r->fd, PGHDR_TO_
19b30 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
19b40 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
19b50 73 65 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  set);.  PAGER_IN
19b60 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
19b70 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a  _readdb_count);.
19b80 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
19b90 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49  ger->nRead);.  I
19ba0 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70  OTRACE(("PGIN %p
19bb0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
19bc0 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 67  pgno));.  if( pg
19bd0 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d  no==1 ){.    mem
19be0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
19bf0 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29  ileVers, &((u8*)
19c00 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
19c10 67 29 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20  g))[24],.       
19c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c40 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50         sizeof(pP
19c50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
19c60 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31  ));.  }.  CODEC1
19c70 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
19c80 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
19c90 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41  ->pgno, 3);.  PA
19ca0 47 45 52 54 52 41 43 45 34 28 22 46 45 54 43 48  GERTRACE4("FETCH
19cb0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
19cc0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
19cd0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
19ce0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
19cf0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
19d00 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20 72 65  hash(pPg));.  re
19d10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
19d20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19d30 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
19d40 74 61 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  tain the shared 
19d50 6c 6f 63 6b 20 72 65 71 75 69 72 65 64 20 62 65  lock required be
19d60 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79  fore.** data may
19d70 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
19d80 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
19d90 66 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  f the shared loc
19da0 6b 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  k has already.**
19db0 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20   been obtained, 
19dc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
19dd0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
19de0 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
19df0 72 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  r obtaining the 
19e00 73 68 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20  shared lock (if 
19e10 72 65 71 75 69 72 65 64 29 2c 20 74 68 69 73 20  required), this 
19e20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63  function.** chec
19e30 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ks for a hot-jou
19e40 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e  rnal file. If on
19e50 65 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65  e is found, an e
19e60 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
19e70 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65  k.** is performe
19e80 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a  d immediately..*
19e90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
19ea0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
19eb0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
19ec0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19ed0 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
19ee0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
19ef0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73 71 6c  NLOCK ){.    sql
19f00 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
19f10 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
19f20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
19f30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19f40 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
19f50 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
19f60 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
19f70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19f80 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
19f90 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
19fa0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
19fb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19fc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
19fd0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
19fe0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
19ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a000 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a010 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
1a020 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOCK );.      }.
1a030 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61    .      /* If a
1a040 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
1a050 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
1a060 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
1a070 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20  ock on the.     
1a080 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1a090 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
1a0a0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
1a0b0 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
1a0c0 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  eted..      */. 
1a0d0 20 20 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a       if( hasHotJ
1a0e0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20 29  ournal(pPager) )
1a0f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  {.        /* Get
1a100 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
1a110 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1a120 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
1a130 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
1a140 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
1a150 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
1a160 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
1a170 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
1a180 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  y to the.       
1a190 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
1a1a0 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
1a1b0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
1a1c0 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
1a1d0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
1a1e0 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
1a1f0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
1a200 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
1a210 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20  that the.       
1a220 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
1a230 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
1a240 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
1a250 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
1a260 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   it .        ** 
1a270 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
1a280 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 63   .        ** Bec
1a290 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
1a2a0 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
1a2b0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
1a2c0 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20  sted, the.      
1a2d0 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63    ** second proc
1a2e0 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ess will get to 
1a2f0 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
1a300 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
1a310 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 62  to.        ** ob
1a320 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58  tain it's own EX
1a330 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1a340 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a350 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
1a360 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a370 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
1a380 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  >fd, EXCLUSIVE_L
1a390 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
1a3a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a3b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
1a3c0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
1a3d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1a3e0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
1a3f0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
1a400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1a410 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1a420 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
1a430 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65   .        /* Ope
1a440 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
1a450 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20  r reading only. 
1a460 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   Return SQLITE_B
1a470 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 20 2a  USY if.        *
1a480 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  * we are unable 
1a490 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
1a4a0 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nal file. .     
1a4b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1a4c0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1a4d0 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  e does not need 
1a4e0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73  to be locked its
1a4f0 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20  elf.  The.      
1a500 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
1a510 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20  e is never open 
1a520 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20  unless the main 
1a530 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  database file ho
1a540 6c 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  lds.        ** a
1a550 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20   write lock, so 
1a560 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61  there is never a
1a570 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f  ny chance of two
1a580 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20   or more.       
1a590 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70   ** processes op
1a5a0 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ening the journa
1a5b0 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  l at the same ti
1a5c0 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  me..        **. 
1a5d0 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 74         ** Open t
1a5e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
1a5f0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
1a600 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
1a610 65 20 69 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  e in .        **
1a620 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
1a630 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
1a640 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
1a650 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  be kept open and
1a660 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
1a670 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
1a680 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
1a690 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79  r on. On some sy
1a6a0 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20  stems, the.     
1a6b0 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65     ** OsTruncate
1a6c0 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20  () call used in 
1a6d0 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
1a6e0 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69   mode also requi
1a6f0 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  res.        ** a
1a700 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65   read/write file
1a710 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 20   handle..       
1a720 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
1a730 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1a740 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1a750 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
1a760 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1a770 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
1a780 45 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20 20  EXISTS) ){.     
1a790 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
1a7a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
1a7b0 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
1a7c0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
1a7d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1a7e0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
1a7f0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
1a800 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1a810 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1a820 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
1a830 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
1a840 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
1a850 2c 20 66 6c 61 67 73 2c 26 66 6f 75 74 29 3b 0a  , flags,&fout);.
1a860 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1a870 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a880 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e  || pPager->jfd->
1a890 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20  pMethods );.    
1a8a0 20 20 20 20 20 20 69 66 28 20 66 6f 75 74 26 53        if( fout&S
1a8b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1a8c0 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
1a8d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1a8e0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20  USY;.           
1a8f0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
1a900 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
1a910 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a920 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1a930 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a940 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
1a950 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
1a960 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1a970 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
1a980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a990 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a9a0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
1a9b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1a9c0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
1a9d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1a9e0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
1a9f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
1aa00 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
1aa10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1aa20 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
1aa30 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
1aa40 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
1aa50 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
1aa60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
1aa70 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ite.        ** l
1aa80 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
1aa90 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
1aaa0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1aab0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1aac0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
1aad0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1aae0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1aaf0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1ab00 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
1ab10 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
1ab20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1ab30 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74  ert(pPager->stat
1ab40 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
1ab50 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
1ab60 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
1ab70 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
1ab80 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
1ab90 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b  ARED).        );
1aba0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1abb0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  if( pPager->pAll
1abc0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1abd0 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
1abe0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
1abf0 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
1ac00 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
1ac10 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
1ac20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
1ac30 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
1ac40 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
1ac50 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20          ** read 
1ac60 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
1ac70 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
1ac80 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
1ac90 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  base.        ** 
1aca0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
1acb0 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
1acc0 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
1acd0 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
1ace0 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
1acf0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1ad00 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
1ad10 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
1ad20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
1ad30 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
1ad40 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  .        ** at o
1ad50 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
1ad60 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
1ad70 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
1ad80 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
1ad90 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
1ada0 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
1adb0 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
1adc0 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
1add0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68  e.        ** oth
1ade0 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
1adf0 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
1ae00 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
1ae10 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
1ae20 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
1ae30 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
1ae40 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
1ae50 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
1ae60 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
1ae70 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
1ae80 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 20 20  not be .        
1ae90 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
1aea0 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
1aeb0 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
1aec0 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
1aed0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  t.        ** it 
1aee0 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
1aef0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1af00 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
1af10 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
1af20 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
1af30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1af40 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1af50 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
1af60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1af70 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  rCode ){.       
1af80 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
1af90 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
1afa0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
1afb0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1afc0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
1afd0 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
1afe0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1aff0 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
1b000 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
1b010 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b020 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1b030 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
1b040 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
1b050 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
1b060 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b070 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1b080 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b0a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b0b0 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
1b0c0 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
1b0d0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1b0e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1b0f0 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67   if( memcmp(pPag
1b100 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1b110 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
1b120 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21  of(dbFileVers))!
1b130 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1b140 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1b150 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
1b160 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b170 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b180 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
1b190 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  | pPager->state<
1b1a0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
1b1b0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1b1c0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
1b1d0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
1b1e0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1b1f0 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
1b200 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1b210 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
1b220 6f 63 61 74 65 20 61 20 50 67 48 64 72 20 6f 62  ocate a PgHdr ob
1b230 6a 65 63 74 2e 20 20 20 45 69 74 68 65 72 20 63  ject.   Either c
1b240 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
1b250 6f 72 20 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65  or reuse.** an e
1b260 78 69 73 74 69 6e 67 20 6f 6e 65 20 74 68 61 74  xisting one that
1b270 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73   is not otherwis
1b280 65 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  e in use..**.** 
1b290 41 20 6e 65 77 20 50 67 48 64 72 20 73 74 72 75  A new PgHdr stru
1b2a0 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
1b2b0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
1b2c0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20  ollowing are.** 
1b2d0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  true:.**.**     
1b2e0 28 31 29 20 20 57 65 20 68 61 76 65 20 6e 6f 74  (1)  We have not
1b2f0 20 65 78 63 65 65 64 65 64 20 6f 75 72 20 6d 61   exceeded our ma
1b300 78 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20  ximum allocated 
1b310 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20  cache size.**   
1b320 20 20 20 20 20 20 20 61 73 20 73 65 74 20 62 79         as set by
1b330 20 74 68 65 20 22 50 52 41 47 4d 41 20 63 61 63   the "PRAGMA cac
1b340 68 65 5f 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64  he_size" command
1b350 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20  ..**.**     (2) 
1b360 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 75 6e   There are no un
1b370 75 73 65 64 20 50 67 48 64 72 20 6f 62 6a 65 63  used PgHdr objec
1b380 74 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20  ts available at 
1b390 74 68 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  this time..**.**
1b3a0 20 20 20 20 20 28 33 29 20 20 54 68 69 73 20 69       (3)  This i
1b3b0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
1b3c0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  atabase..**.**  
1b3d0 20 20 20 28 34 29 20 20 54 68 65 72 65 20 61 72     (4)  There ar
1b3e0 65 20 6e 6f 20 50 67 48 64 72 20 6f 62 6a 65 63  e no PgHdr objec
1b3f0 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72  ts that do not r
1b400 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
1b410 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 69 6c  .**          fil
1b420 65 20 73 79 6e 63 20 61 6e 64 20 61 20 73 79 6e  e sync and a syn
1b430 63 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  c of the journal
1b440 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
1b450 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 70  ly.**          p
1b460 72 6f 68 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a  rohibited..**.**
1b470 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 75 73   Otherwise, reus
1b480 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 50 67  e an existing Pg
1b490 48 64 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  Hdr.  In other w
1b4a0 6f 72 64 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a  ords, reuse an.*
1b4b0 2a 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72  * existing PgHdr
1b4c0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
1b4d0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
1b4e0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  e:.**.**     (1)
1b4f0 20 20 57 65 20 68 61 76 65 20 72 65 61 63 68 65    We have reache
1b500 64 20 6f 72 20 65 78 63 65 65 64 65 64 20 74 68  d or exceeded th
1b510 65 20 6d 61 78 69 6d 75 6d 20 63 61 63 68 65 20  e maximum cache 
1b520 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  size.**         
1b530 20 61 6c 6c 6f 77 65 64 20 62 79 20 22 50 52 41   allowed by "PRA
1b540 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 2e  GMA cache_size".
1b550 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20  .**.**     (2)  
1b560 54 68 65 72 65 20 69 73 20 61 20 50 67 48 64 72  There is a PgHdr
1b570 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20   available with 
1b580 50 67 48 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a  PgHdr->nRef==0.*
1b590 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 57 65  *.**     (3)  We
1b5a0 20 61 72 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69   are not in an i
1b5b0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1b5c0 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20  e.**.**     (4) 
1b5d0 20 45 69 74 68 65 72 20 74 68 65 72 65 20 69 73   Either there is
1b5e0 20 61 6e 20 61 76 61 69 6c 61 62 6c 65 20 50 67   an available Pg
1b5f0 48 64 72 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  Hdr that does no
1b600 74 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 20  t need.**       
1b610 20 20 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20     to be synced 
1b620 74 6f 20 64 69 73 6b 20 6f 72 20 65 6c 73 65 20  to disk or else 
1b630 64 69 73 6b 20 73 79 6e 63 69 6e 67 20 69 73 20  disk syncing is 
1b640 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
1b650 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a        allowed..*
1b660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1b670 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 50  erAllocatePage(P
1b680 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1b690 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69  Hdr **ppPg){.  i
1b6a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b6b0 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  K;.  PgHdr *pPg;
1b6c0 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20  ..  /* Create a 
1b6d0 6e 65 77 20 50 67 48 64 72 20 69 66 20 61 6e 79  new PgHdr if any
1b6e0 20 6f 66 20 74 68 65 20 66 6f 75 72 20 63 6f 6e   of the four con
1b6f0 64 69 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20  ditions defined 
1b700 0a 20 20 2a 2a 20 61 62 6f 76 65 20 61 72 65 20  .  ** above are 
1b710 6d 65 74 3a 20 2a 2f 0a 20 20 69 66 28 20 70 50  met: */.  if( pP
1b720 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67  ager->nPage<pPag
1b730 65 72 2d 3e 6d 78 50 61 67 65 0a 20 20 20 7c 7c  er->mxPage.   ||
1b740 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
1b750 3d 30 20 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a  =0 .   || MEMDB.
1b760 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 70     || (pPager->p
1b770 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26  FirstSynced==0 &
1b780 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  & pPager->doNotS
1b790 79 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 69 66  ync).  ){.    if
1b7a0 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e  ( pPager->nPage>
1b7b0 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29  =pPager->nHash )
1b7c0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
1b7d0 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28  size_hash_table(
1b7e0 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20  pPager,.        
1b7f0 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32   pPager->nHash<2
1b800 35 36 20 3f 20 32 35 36 20 3a 20 70 50 61 67 65  56 ? 256 : pPage
1b810 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20  r->nHash*2);.   
1b820 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
1b830 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Hash==0 ){.     
1b840 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1b850 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f  OMEM;.        go
1b860 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
1b870 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
1b880 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c 65     }.    pagerLe
1b890 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
1b8a0 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d   pPg = sqlite3_m
1b8b0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
1b8c0 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  Pg) + pPager->pa
1b8d0 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20  geSize.         
1b8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8f0 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29     + sizeof(u32)
1b900 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
1b910 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
1b930 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48  MEMDB*sizeof(PgH
1b940 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 70  istory) );.    p
1b950 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
1b960 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  );.    if( pPg==
1b970 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1b980 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1b990 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
1b9a0 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
1b9b0 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50   }.    memset(pP
1b9c0 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50  g, 0, sizeof(*pP
1b9d0 67 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  g));.    if( MEM
1b9e0 44 42 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  DB ){.      mems
1b9f0 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  et(PGHDR_TO_HIST
1ba00 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
1ba10 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  , sizeof(PgHisto
1ba20 72 79 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ry));.    }.    
1ba30 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
1ba40 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70  ager;.    pPg->p
1ba50 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
1ba60 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67  ->pAll;.    pPag
1ba70 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a  er->pAll = pPg;.
1ba80 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
1ba90 65 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e++;.  }else{.  
1baa0 20 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20    /* Recycle an 
1bab0 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 77 69  existing page wi
1bac0 74 68 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f  th a zero ref-co
1bad0 75 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  unt. */.    rc =
1bae0 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
1baf0 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b  Pager, 1, &pPg);
1bb00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1bb10 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
1bb20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1bb30 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20  ERR_BLOCKED;.   
1bb40 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
1bb50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bb60 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c    goto pager_all
1bb70 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ocate_out;.    }
1bb80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1bb90 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
1bba0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
1bbb0 73 73 65 72 74 28 70 50 67 29 3b 0a 20 20 7d 0a  ssert(pPg);.  }.
1bbc0 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 0a    *ppPg = pPg;..
1bbd0 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
1bbe0 75 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ut:.  return rc;
1bbf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1bc00 75 72 65 20 77 65 20 68 61 76 65 20 74 68 65 20  ure we have the 
1bc10 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20 70 61  content for a pa
1bc20 67 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ge.  If the page
1bc30 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73   was.** previous
1bc40 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68  ly acquired with
1bc50 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74   noContent==1, t
1bc60 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
1bc70 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74  was.** just init
1bc80 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
1bc90 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65 69 6e   instead of bein
1bca0 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  g read from disk
1bcb0 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65 20  ..** But now we 
1bcc0 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20 64 61  need the real da
1bcd0 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20  ta off of disk. 
1bce0 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65   So make sure we
1bcf0 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20 52 65  .** have it.  Re
1bd00 61 64 20 69 74 20 69 6e 20 69 66 20 77 65 20 64  ad it in if we d
1bd10 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20 61 6c  o not have it al
1bd20 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ready..*/.static
1bd30 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74 5f 63   int pager_get_c
1bd40 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a 70 50  ontent(PgHdr *pP
1bd50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g){.  if( pPg->n
1bd60 65 65 64 52 65 61 64 20 29 7b 0a 20 20 20 20 69  eedRead ){.    i
1bd70 6e 74 20 72 63 20 3d 20 72 65 61 64 44 62 50 61  nt rc = readDbPa
1bd80 67 65 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20  ge(pPg->pPager, 
1bd90 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  pPg, pPg->pgno);
1bda0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1bdb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bdc0 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
1bdd0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1bde0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1bdf0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1be00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1be10 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
1be20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  page..**.** A re
1be30 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
1be40 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61  isk file is obta
1be50 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69  ined when the fi
1be60 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75  rst page is acqu
1be70 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72  ired. .** This r
1be80 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70  ead lock is drop
1be90 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ped when the las
1bea0 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
1beb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
1bec0 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72  outine works for
1bed0 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72   any page number
1bee0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e   greater than 0.
1bef0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1bf00 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61  e.** file is sma
1bf10 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
1bf20 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68  quested page, th
1bf30 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73  en no actual dis
1bf40 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73  k.** read occurs
1bf50 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20   and the memory 
1bf60 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  image of the pag
1bf70 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
1bf80 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73   to.** all zeros
1bf90 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74  .  The extra dat
1bfa0 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
1bfb0 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
1bfc0 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f  nitialized.** to
1bfd0 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74   zeros the first
1bfe0 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
1bff0 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
1c000 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  ry..**.** The ac
1c010 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
1c020 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
1c030 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
1c040 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
1c050 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
1c060 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1c070 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
1c080 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
1c090 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
1c0a0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1c0b0 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
1c0c0 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
1c0d0 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
1c0e0 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
1c0f0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
1c100 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
1c110 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
1c120 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
1c130 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
1c140 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
1c150 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
1c160 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
1c170 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
1c180 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
1c190 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
1c1a0 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
1c1b0 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
1c1c0 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
1c1d0 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
1c1e0 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
1c1f0 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
1c200 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
1c210 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
1c220 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
1c230 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
1c240 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
1c250 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
1c260 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
1c270 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67  s false, the pag
1c280 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61  e contents are a
1c290 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f  ctually read fro
1c2a0 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f  m disk..** If no
1c2b0 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
1c2c0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
1c2d0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
1c2e0 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
1c2f0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
1c300 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 73 6f  at this time, so
1c310 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64 69 73   do not do a dis
1c320 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20 66 69  k read.  Just fi
1c330 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ll in the.** pag
1c340 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a  e content with z
1c350 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72 6b 20  eros.  But mark 
1c360 74 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65  the fact that we
1c370 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64 20 74   have not read t
1c380 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79  he.** content by
1c390 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48   setting the PgH
1c3a0 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67  dr.needRead flag
1c3b0 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20  .  Later on, if 
1c3c0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
1c3d0 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
1c3e0 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20 6f  d on this page o
1c3f0 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  r if this routin
1c400 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61  e is.** called a
1c410 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74  gain with noCont
1c420 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  ent==0, that mea
1c430 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  ns that the cont
1c440 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ent is needed.**
1c450 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20 72 65   and the disk re
1c460 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
1c470 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
1c480 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1c490 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
1c4a0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1c4b0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
1c4c0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
1c4d0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
1c4e0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
1c4f0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
1c500 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
1c510 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
1c520 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
1c530 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
1c540 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
1c550 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f  oContent       /
1c560 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
1c570 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20  reading content 
1c580 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75  from disk if tru
1c590 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20  e */.){.  PgHdr 
1c5a0 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
1c5b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1c5c0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1c5d0 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  UNLOCK || pPager
1c5e0 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f  ->nRef>0 || pgno
1c5f0 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ==1 );..  /* The
1c600 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75   maximum page nu
1c610 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65  mber is 2^31. Re
1c620 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1c630 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20  UPT if a page.  
1c640 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ** number greate
1c650 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20  r than this, or 
1c660 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74  zero, is request
1c670 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
1c680 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
1c690 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c  NO || pgno==0 ||
1c6a0 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
1c6b0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
1c6c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c6d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1c6e0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
1c6f0 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20  ure we have not 
1c700 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c  hit any critical
1c710 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20   errors..  */ . 
1c720 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
1c730 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  =0 );.  *ppPage 
1c740 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
1c750 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
1c760 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
1c770 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
1c780 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1c790 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20  >errCode;.  }.. 
1c7a0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1c7b0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63  he first page ac
1c7c0 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74  cessed, then get
1c7d0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20   a SHARED lock. 
1c7e0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
1c7f0 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53  ase file. pagerS
1c800 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61  haredLock() is a
1c810 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20   no-op if .  ** 
1c820 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  a database lock 
1c830 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e  is already held.
1c840 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
1c850 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61  erSharedLock(pPa
1c860 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
1c870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c880 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1c890 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c8a0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
1c8b0 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20  NLOCK );..  pPg 
1c8c0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1c8d0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1c8e0 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
1c8f0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1c900 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  ed page is not i
1c910 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
1c920 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61  . */.    int nMa
1c930 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  x;.    int h;.  
1c940 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
1c950 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
1c960 20 72 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f 63   rc = pagerAlloc
1c970 61 74 65 50 61 67 65 28 70 50 61 67 65 72 2c 20  atePage(pPager, 
1c980 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  &pPg);.    if( r
1c990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c9a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c9b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d  .    }..    pPg-
1c9c0 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
1c9d0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
1c9e0 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d   || pgno>pPager-
1c9f0 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20 20  >stmtSize );.   
1ca00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
1ca10 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
1ca20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
1ca30 69 67 44 62 53 69 7a 65 20 29 7b 0a 23 69 66 20  igDbSize ){.#if 
1ca40 30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  0.      sqlite3C
1ca50 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65  heckMemory(pPage
1ca60 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->aInJournal, p
1ca70 67 6e 6f 2f 38 29 3b 0a 23 65 6e 64 69 66 0a 20  gno/8);.#endif. 
1ca80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1ca90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1caa0 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
1cab0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
1cac0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1cad0 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
1cae0 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20  no&7)))!=0;.    
1caf0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
1cb00 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1cb10 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
1cb20 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
1cb30 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1cb40 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61  0;.    }..    ma
1cb50 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
1cb60 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b    pPg->nRef = 1;
1cb70 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67  .    REFINFO(pPg
1cb80 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  );..    pPager->
1cb90 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20  nRef++;.    if( 
1cba0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30  pPager->nExtra>0
1cbb0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
1cbc0 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
1cbd0 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
1cbe0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
1cbf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78  ;.    }.    nMax
1cc00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
1cc10 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
1cc20 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1cc30 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1cc40 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1cc50 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
1cc60 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
1cc70 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74  rCode;.      ret
1cc80 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
1cc90 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
1cca0 68 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74  he page with dat
1ccb0 61 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61  a, either by rea
1ccc0 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
1ccd0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
1cce0 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e  le, or by settin
1ccf0 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67  g the entire pag
1cd00 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a  e to zero..    *
1cd10 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28  /.    if( nMax<(
1cd20 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44  int)pgno || MEMD
1cd30 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20  B || (noContent 
1cd40 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61  && !pPager->alwa
1cd50 79 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20  ysRollback) ){. 
1cd60 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
1cd70 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
1cd80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1cd90 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
1cda0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1cdb0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
1cdc0 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
1cdd0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
1cde0 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
1cdf0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1ce00 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
1ce10 20 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70   noContent && !p
1ce20 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1ce30 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54  lback;.      IOT
1ce40 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
1ce50 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1ce60 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
1ce70 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
1ce80 44 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70  DbPage(pPager, p
1ce90 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg, pgno);.     
1cea0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ceb0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
1cec0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1ced0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  D ){.        pPg
1cee0 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  ->pgno = 0;.    
1cef0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1cf00 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1cf10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1cf20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
1cf30 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
1cf40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69      }..    /* Li
1cf50 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  nk the page into
1cf60 20 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74   the page hash t
1cf70 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20  able */.    h = 
1cf80 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
1cf90 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73  nHash-1);.    as
1cfa0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
1cfb0 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
1cfc0 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
1cfd0 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67  ash[h];.    pPag
1cfe0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
1cff0 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
1d000 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
1d010 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1d020 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
1d030 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
1d040 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
1d050 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
1d060 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  g;.    }..#ifdef
1d070 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1d080 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
1d090 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
1d0a0 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
1d0b0 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
1d0c0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
1d0d0 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65  d page is in the
1d0e0 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
1d0f0 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
1d100 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e  r->nRef>0 || pgn
1d110 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52  o==1);.    PAGER
1d120 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
1d130 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f  it);.    if( !no
1d140 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
1d150 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f   rc = pager_get_
1d160 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
1d170 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1d180 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d1a0 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29     page_ref(pPg)
1d1b0 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
1d1c0 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20  = pPg;.  return 
1d1d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
1d1e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
1d1f0 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
1d200 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
1d210 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
1d220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d230 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
1d240 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
1d250 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
1d260 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
1d270 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
1d280 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
1d290 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
1d2a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
1d2b0 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ent       /* Do 
1d2c0 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69  not bother readi
1d2d0 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ng content from 
1d2e0 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a  disk if true */.
1d2f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  ){.  int rc;.  p
1d300 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
1d310 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 41  );.  rc = pagerA
1d320 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
1d330 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
1d340 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 61 67 65 72  ontent);.  pager
1d350 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
1d360 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1d370 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
1d380 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
1d390 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
1d3a0 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
1d3b0 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
1d3c0 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
1d3d0 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
1d3e0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
1d3f0 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
1d400 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
1d410 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ache..**.** See 
1d420 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
1d430 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
1d440 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1d450 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1d460 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
1d470 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
1d480 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
1d490 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
1d4a0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
1d4b0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1d4c0 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
1d4d0 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
1d4e0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
1d4f0 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
1d500 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
1d510 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
1d520 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
1d530 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
1d540 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
1d550 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
1d560 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1d570 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
1d580 70 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  pPg = 0;..  asse
1d590 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
1d5a0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
1d5b0 3d 30 20 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e  =0 );..  pagerEn
1d5c0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
1d5d0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1d5e0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
1d5f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
1d600 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70  Pager->pAll || p
1d610 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1d620 4d 6f 64 65 20 29 3b 0a 20 20 7d 65 6c 73 65 20  Mode );.  }else 
1d630 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1d640 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
1d650 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
1d660 55 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ULL ){.    /* Do
1d670 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65   nothing */.  }e
1d680 6c 73 65 20 69 66 28 20 28 70 50 67 20 3d 20 70  lse if( (pPg = p
1d690 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
1d6a0 65 72 2c 20 70 67 6e 6f 29 29 21 3d 30 20 29 7b  er, pgno))!=0 ){
1d6b0 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
1d6c0 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c  g);.  }.  pagerL
1d6d0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
1d6e0 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f  return pPg;.}../
1d6f0 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
1d700 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
1d710 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
1d720 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
1d730 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
1d740 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
1d750 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
1d760 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
1d770 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
1d780 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
1d790 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
1d7a0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1d7b0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
1d7c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1d7d0 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
1d7e0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1d7f0 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50  Unref(DbPage *pP
1d800 67 29 7b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d  g){..  /* Decrem
1d810 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
1d820 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73  e count for this
1d830 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73   page.  */.  ass
1d840 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
1d850 20 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72   );.  pagerEnter
1d860 28 70 50 67 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pPg->pPager);. 
1d870 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pPg->nRef--;.  
1d880 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20  REFINFO(pPg);.. 
1d890 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
1d8a0 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  ;..  /* When the
1d8b0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
1d8c0 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20  ences to a page 
1d8d0 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68  reach 0, call th
1d8e0 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f  e.  ** destructo
1d8f0 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61  r and add the pa
1d900 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
1d910 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
1d920 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
1d930 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
1d940 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70  ;.    pPager = p
1d950 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
1d960 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
1d970 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   0;.    pPg->pPr
1d980 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d  evFree = pPager-
1d990 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67  >pLast;.    pPag
1d9a0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b  er->pLast = pPg;
1d9b0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
1d9c0 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
1d9d0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
1d9e0 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
1d9f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1da00 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
1da10 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
1da20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
1da30 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65  Sync==0 && pPage
1da40 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
1da50 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
1da60 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
1da70 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
1da80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
1da90 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
1daa0 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
1dab0 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67  ructor(pPg, pPag
1dac0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1dad0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
1dae0 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65  hen all pages re
1daf0 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  ach the freelist
1db00 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20  , drop the read 
1db10 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  lock from.    **
1db20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1db30 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  le..    */.    p
1db40 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
1db50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1db60 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20  r->nRef>=0 );.  
1db70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
1db80 65 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65  ef==0 && (!pPage
1db90 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
1dba0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
1dbb0 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20  nalOff>0) ){.   
1dbc0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
1dbd0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
1dbe0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
1dbf0 61 67 65 72 4c 65 61 76 65 28 70 50 67 2d 3e 70  agerLeave(pPg->p
1dc00 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1dc10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1dc20 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
1dc30 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
1dc40 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
1dc50 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
1dc60 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72  a RESERVED.** or
1dc70 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1dc80 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1dc90 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
1dca0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1dcb0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1dcc0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
1dcd0 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
1dce0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
1dcf0 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
1dd00 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
1dd10 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
1dd20 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1dd30 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
1dd40 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1dd50 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
1dd60 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
1dd70 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66  r->pVfs;.  int f
1dd80 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
1dd90 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
1dda0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
1ddb0 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
1ddc0 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20  CREATE);..  int 
1ddd0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
1dde0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
1ddf0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1de00 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1de10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1de20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1de30 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1de40 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
1de50 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
1de60 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1de70 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal==0 );.  sqli
1de80 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1de90 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67  t(pPager);.  pag
1dea0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
1deb0 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
1dec0 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d  urnal = sqlite3M
1ded0 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67 65  allocZero( pPage
1dee0 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
1def0 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
1df00 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
1df10 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1df20 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
1df30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1df40 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
1df50 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
1df60 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
1df70 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
1df80 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c     flags |= (SQL
1df90 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1dfa0 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50  NCLOSE|SQLITE_OP
1dfb0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
1dfc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
1dfd0 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f  lags |= (SQLITE_
1dfe0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
1dff0 4c 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  L);.  }.#ifdef S
1e000 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
1e010 4d 49 43 5f 57 52 49 54 45 0a 20 20 72 63 20 3d  MIC_WRITE.  rc =
1e020 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
1e030 70 65 6e 28 0a 20 20 20 20 20 20 70 56 66 73 2c  pen(.      pVfs,
1e040 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1e050 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
1e060 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
1e070 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
1e080 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20  );.#else.  rc = 
1e090 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
1e0a0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
1e0b0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
1e0c0 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65  d, flags, 0);.#e
1e0d0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 72  ndif.  assert( r
1e0e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1e0f0 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
1e100 74 68 6f 64 73 20 29 3b 0a 20 20 70 50 61 67 65  thods );.  pPage
1e110 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1e120 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
1e130 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
1e140 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1e150 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
1e160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e170 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e180 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73  NOMEM ){.      s
1e190 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
1e1a0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
1e1b0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  urnal, 0);.    }
1e1c0 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
1e1d0 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
1e1e0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1e1f0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
1e200 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
1e210 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
1e220 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1e230 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
1e240 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1e250 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
1e260 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Rec = 0;.  if( p
1e270 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1e280 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
1e290 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
1e2a0 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
1e2b0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
1e2c0 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
1e2d0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1e2e0 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20  dbSize;..  rc = 
1e2f0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1e300 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
1e310 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
1e320 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  open && rc==SQLI
1e330 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1e340 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
1e350 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b  mtBegin(pPager);
1e360 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
1e370 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
1e380 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
1e390 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
1e3a0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
1e3b0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1e3c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e3d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e3e0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
1e3f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1e400 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
1e410 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
1e420 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
1e430 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  aInJournal);.  p
1e440 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1e450 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  l = 0;.  return 
1e460 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
1e470 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
1e480 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1e490 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
1e4a0 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20  removed when.** 
1e4b0 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66  the any of the f
1e4c0 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a  ollowing happen:
1e4d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  .**.**   *  sqli
1e4e0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1e4f0 61 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c  aseTwo() is call
1e500 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
1e510 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1e520 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
1e530 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
1e540 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  erClose() is cal
1e550 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
1e560 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
1e570 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e   is called to on
1e580 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69   every outstandi
1e590 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ng page..**.** T
1e5a0 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
1e5b0 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  er to this routi
1e5c0 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ne is a pointer 
1e5d0 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65  to any open page
1e5e0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
1e5f0 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69  ase file.  Nothi
1e600 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74  ng changes about
1e610 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69   the page - it i
1e620 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f  s used merely to
1e630 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f  .** acquire a po
1e640 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
1e650 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
1e660 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74   as proof that t
1e670 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61  here is.** alrea
1e680 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  dy a read-lock o
1e690 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
1e6a0 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
1e6b0 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
1e6c0 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70  ates how much sp
1e6d0 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20  ace in bytes to 
1e6e0 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a  reserve for a.**
1e6f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1e700 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65  file-name at the
1e710 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
1e720 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73  urnal when it is
1e730 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
1e740 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  A journal file i
1e750 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73  s opened if this
1e760 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
1e770 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74  ary file.  For t
1e780 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
1e790 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f  s, the opening o
1e7a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1e7b0 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
1e7c0 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
1e7d0 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20  .** actual need 
1e7e0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
1e7f0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
1e800 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1e810 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76  s already reserv
1e820 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20  ed for writing, 
1e830 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1e840 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
1e850 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
1e860 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67  , go ahead and g
1e870 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
1e880 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
1e890 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
1e8a0 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69  instead of waiti
1e8b0 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20  ng until we try 
1e8c0 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  to flush the cac
1e8d0 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c  he.  The.** exFl
1e8e0 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  ag is ignored if
1e8f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1e900 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
1e910 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e920 50 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67  PagerBegin(DbPag
1e930 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c  e *pPg, int exFl
1e940 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  ag){.  Pager *pP
1e950 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1e960 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
1e970 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67 65  QLITE_OK;.  page
1e980 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
1e990 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1e9a0 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
1e9b0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1e9c0 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1e9d0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1e9e0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
1e9f0 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
1ea00 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
1ea10 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
1ea20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1ea30 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1ea40 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
1ea50 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
1ea60 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
1ea70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1ea80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ea90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
1eaa0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
1eab0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
1eac0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ead0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1eae0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1eaf0 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
1eb00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
1eb10 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
1eb20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
1eb30 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
1eb40 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
1eb50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1eb60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1eb70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1eb80 20 20 20 20 20 20 20 20 70 61 67 65 72 4c 65 61          pagerLea
1eb90 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ve(pPager);.    
1eba0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ebb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1ebc0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1ebd0 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52  = 0;.      PAGER
1ebe0 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54  TRACE2("TRANSACT
1ebf0 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
1ec00 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1ec10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
1ec20 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
1ec30 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1ec40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
1ec50 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1ec60 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1ec70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1ec80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1ec90 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
1eca0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1ecb0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
1ecc0 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68   happens when th
1ecd0 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
1ece0 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
1ecf0 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a  mode last.    **
1ed00 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
1ed10 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
1ed20 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
1ed30 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
1ed40 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
1ed50 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
1ed60 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
1ed70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1ed80 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
1ed90 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e  pt open and trun
1eda0 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
1edb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1edc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
1edd0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
1ede0 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
1edf0 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  DbSize==0 );.   
1ee00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ee10 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
1ee20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
1ee30 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1ee40 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c 65  er);.    pagerLe
1ee50 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
1ee60 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1ee70 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nal = sqlite3Mal
1ee80 6c 6f 63 5a 65 72 6f 28 20 70 50 61 67 65 72 2d  locZero( pPager-
1ee90 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
1eea0 0a 20 20 20 20 70 61 67 65 72 45 6e 74 65 72 28  .    pagerEnter(
1eeb0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1eec0 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   !pPager->aInJou
1eed0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
1eee0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1eef0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ef00 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
1ef10 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1ef20 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20  bSize;.      rc 
1ef30 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
1ef40 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
1ef50 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
1ef60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1ef70 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  pen || pPager->j
1ef80 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72  ournalOff>0 || r
1ef90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1efa0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
1efb0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
1efc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
1efd0 20 61 20 70 61 67 65 20 64 69 72 74 79 2e 20 20   a page dirty.  
1efe0 53 65 74 20 69 74 73 20 64 69 72 74 79 20 66 6c  Set its dirty fl
1eff0 61 67 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f  ag and add it to
1f000 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61   the dirty.** pa
1f010 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ge list..*/.stat
1f020 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74  ic void makeDirt
1f030 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  y(PgHdr *pPg){. 
1f040 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d   if( pPg->dirty=
1f050 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
1f060 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1f070 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
1f080 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
1f090 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61  Pg->pDirty = pPa
1f0a0 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ger->pDirty;.   
1f0b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69   if( pPager->pDi
1f0c0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61  rty ){.      pPa
1f0d0 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72  ger->pDirty->pPr
1f0e0 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  evDirty = pPg;. 
1f0f0 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
1f100 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  revDirty = 0;.  
1f110 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
1f120 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = pPg;.  }.}../
1f130 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
1f140 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69   clean.  Clear i
1f150 74 73 20 64 69 72 74 79 20 62 69 74 20 61 6e 64  ts dirty bit and
1f160 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
1f170 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
1f180 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
1f190 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
1f1a0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1f1b0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
1f1c0 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  {.    pPg->dirty
1f1d0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
1f1e0 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20  g->pDirty ){.   
1f1f0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1f200 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72  pDirty->pPrevDir
1f210 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20  ty==pPg );.     
1f220 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50   pPg->pDirty->pP
1f230 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  revDirty = pPg->
1f240 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20 20 20  pPrevDirty;.    
1f250 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
1f260 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20 20 20  PrevDirty ){.   
1f270 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1f280 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72  pPrevDirty->pDir
1f290 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20  ty==pPg );.     
1f2a0 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
1f2b0 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  ->pDirty = pPg->
1f2c0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73  pDirty;.    }els
1f2d0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1f2e0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44   pPg->pPager->pD
1f2f0 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20  irty==pPg );.   
1f300 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
1f310 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44  pDirty = pPg->pD
1f320 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  irty;.    }.  }.
1f330 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  }.../*.** Mark a
1f340 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
1f350 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
1f360 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
1f370 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
1f380 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
1f390 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
1f3a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
1f3b0 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
1f3c0 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
1f3d0 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
1f3e0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
1f3f0 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
1f400 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
1f410 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
1f420 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
1f430 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
1f440 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
1f450 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1f460 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
1f470 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
1f480 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
1f490 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1f4a0 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
1f4b0 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
1f4c0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
1f4d0 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
1f4e0 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
1f4f0 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
1f500 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
1f510 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
1f520 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1f530 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
1f540 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
1f550 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
1f560 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
1f570 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
1f580 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
1f590 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1f5a0 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
1f5b0 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
1f5c0 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
1f5d0 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
1f5e0 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
1f5f0 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
1f600 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
1f610 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
1f620 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1f630 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69  Commit() or sqli
1f640 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1f650 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a  () to.** reset..
1f660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f670 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
1f680 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
1f690 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
1f6a0 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67  DATA(pPg);.  Pag
1f6b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1f6c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1f6d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f6e0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
1f6f0 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66  errors.  */.  if
1f700 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1f710 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  e ){ .    return
1f720 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1f730 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1f740 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
1f750 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f760 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61  E_PERM;.  }..  a
1f770 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1f780 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
1f790 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
1f7a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
1f7b0 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  age was previous
1f7c0 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68  ly acquired with
1f7d0 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74   noContent==1, t
1f7e0 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77  hat means.  ** w
1f7f0 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20  e didn't really 
1f800 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  read in the cont
1f810 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
1f820 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65    This can happe
1f830 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d  n.  ** (for exam
1f840 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70 61  ple) when the pa
1f850 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65  ge is being move
1f860 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1f870 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77  t.  But.  ** now
1f880 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70 73   we are (perhaps
1f890 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67  ) moving the pag
1f8a0 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65  e off of the fre
1f8b0 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72  elist for.  ** r
1f8c0 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64  euse and we need
1f8d0 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69   to know its ori
1f8e0 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f  ginal content so
1f8f0 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20   that content.  
1f900 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  ** can be stored
1f910 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
1f920 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f   journal.  So do
1f930 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68 69   the read at thi
1f940 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a  s.  ** time..  *
1f950 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67  /.  rc = pager_g
1f960 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b  et_content(pPg);
1f970 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1f980 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1f990 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
1f9a0 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
1f9b0 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
1f9c0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1f9d0 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
1f9e0 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
1f9f0 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
1fa00 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61   away..  */.  ma
1fa10 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
1fa20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  if( pPg->inJourn
1fa30 61 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74 61  al && (pageInSta
1fa40 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20 70  tement(pPg) || p
1fa50 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1fa60 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67  ==0) ){.    pPag
1fa70 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1fa80 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20   1;.  }else{..  
1fa90 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
1faa0 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
1fab0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
1fac0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
1fad0 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ** written to th
1fae0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
1faf0 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65  urnal or the cke
1fb00 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a  ckpoint journal.
1fb10 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a      ** or both..
1fb20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69      **.    ** Fi
1fb30 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65  rst check to see
1fb40 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
1fb50 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78  ction journal ex
1fb60 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ists and.    ** 
1fb70 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20  create it if it 
1fb80 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f  does not..    */
1fb90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1fba0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1fbb0 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  R_UNLOCK );.    
1fbc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fbd0 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a  rBegin(pPg, 0);.
1fbe0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fbf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1fc00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1fc10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1fc20 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1fc30 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
1fc40 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
1fc50 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
1fc60 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1fc70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1fc80 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1fc90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1fca0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fcb0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1fcc0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1fcd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1fce0 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d  Open || !pPager-
1fcf0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
1fd00 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
1fd10 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20  Cache = 1;.  .  
1fd20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
1fd30 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
1fd40 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
1fd50 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
1fd60 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
1fd70 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1fd80 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1fd90 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
1fda0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
1fdb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
1fdc0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1fdd0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
1fde0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
1fdf0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  */.    if( !pPg-
1fe00 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
1fe10 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1fe20 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20  l || MEMDB) ){. 
1fe30 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50       if( (int)pP
1fe40 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
1fe50 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
1fe60 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50  .        int szP
1fe70 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d  g;.        if( M
1fe80 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
1fe90 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1fea0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1feb0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
1fec0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
1fed0 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20  TRACE3("JOURNAL 
1fee0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1fef0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1ff00 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1ff10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
1ff20 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b  ist->pOrig==0 );
1ff30 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74  .          pHist
1ff40 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65  ->pOrig = sqlite
1ff50 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  3_malloc( pPager
1ff60 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
1ff70 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
1ff80 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
1ff90 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
1ffa0 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48  Hist->pOrig, PGH
1ffb0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1ffc0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1ffd0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
1ffe0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1fff0 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73           u32 cks
20000 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20 20 20  um, saved;.     
20010 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
20020 32 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 20  2, *pEnd;..     
20030 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c       /* We shoul
20040 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
20050 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20060 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
20070 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
20080 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
20090 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
200a0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
200b0 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
200c0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
200d0 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
200e0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
200f0 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
20100 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
20110 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20           pData2 
20120 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
20130 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
20140 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20  o, 7);.         
20150 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
20160 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
20170 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  *)pData2);.     
20180 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61 74       pEnd = pDat
20190 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67  a2 + pPager->pag
201a0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  eSize;.         
201b0 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20   pData2 -= 4;.  
201c0 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20          saved = 
201d0 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20  *(u32*)pEnd;.   
201e0 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
201f0 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20  (pEnd, cksum);. 
20200 20 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20           szPg = 
20210 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20220 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  +8;.          pu
20230 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c 20  t32bits(pData2, 
20240 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
20250 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20260 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
20270 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 73  ->jfd, pData2, s
20280 7a 50 67 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zPg, pPager->jou
20290 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20  rnalOff);.      
202a0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f      IOTRACE(("JO
202b0 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64  UT %p %d %lld %d
202c0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
202d0 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
202e0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
202f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73  r->journalOff, s
20300 7a 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20  zPg));.         
20310 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
20320 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
20330 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
20340 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
20350 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20  alOff += szPg;. 
20360 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
20370 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE5("JOURNAL %d
20380 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
20390 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
203a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
203b0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
203c0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
203d0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61  Pg->needSync, pa
203e0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
203f0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  ));.          *(
20400 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65  u32*)pEnd = save
20410 64 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  d;..          /*
20420 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   An error has oc
20430 63 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  cured writing to
20440 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20450 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
20460 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
20470 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20   will be rolled 
20480 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65  back by the laye
20490 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  r above..       
204a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
204b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
204c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
204d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
204e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
204f0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
20500 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  +;.          ass
20510 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
20520 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
20530 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
20540 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
20550 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
20560 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
20570 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64         pPg->need
20580 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
20590 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
205a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
205b0 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
205c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
205d0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
205e0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
205f0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
20600 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
20610 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20620 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
20630 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  c = !pPager->jou
20640 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
20650 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
20660 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
20670 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE4("APPEND %d p
20680 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
20690 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
206a0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
206b0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
206c0 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
206d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
206e0 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
206f0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  nc ){.        pP
20700 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
20710 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
20720 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
20730 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 1;.    }.  . 
20740 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
20750 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
20760 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
20770 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
20780 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
20790 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
207a0 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
207b0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
207c0 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
207d0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
207e0 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
207f0 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
20800 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
20810 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
20820 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
20830 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
20840 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
20850 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
20860 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20  er->stmtInUse . 
20870 20 20 20 20 26 26 20 21 70 61 67 65 49 6e 53 74      && !pageInSt
20880 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20 20  atement(pPg) .  
20890 20 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e     && (int)pPg->
208a0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
208b0 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20  mtSize .    ){. 
208c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
208d0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
208e0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
208f0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
20900 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45   );.      if( ME
20910 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50  MDB ){.        P
20920 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
20930 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
20940 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
20950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
20960 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b  ist->pStmt==0 );
20970 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
20980 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f  pStmt = sqlite3_
20990 6d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  malloc( pPager->
209a0 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
209b0 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
209c0 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
209d0 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e    memcpy(pHist->
209e0 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f  pStmt, PGHDR_TO_
209f0 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
20a00 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
20a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20a20 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d  PAGERTRACE3("STM
20a30 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
20a40 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
20a50 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
20a60 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 61  gno);.        pa
20a70 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
20a80 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
20a90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
20aa0 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67  64 offset = pPag
20ab0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b  er->stmtNRec*(4+
20ac0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20ad0 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  );.        char 
20ae0 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32  *pData2 = CODEC2
20af0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
20b00 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b  pPg->pgno, 7)-4;
20b10 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69  .        put32bi
20b20 74 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e  ts(pData2, pPg->
20b30 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  pgno);.        r
20b40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
20b50 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
20b60 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
20b70 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 6f 66 66  >pageSize+4, off
20b80 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41  set);.        PA
20b90 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
20ba0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
20bb0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
20bc0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
20bd0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
20be0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20bf0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
20c00 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
20c10 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
20c20 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  stmtNRec++;.    
20c30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
20c40 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
20c50 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
20c60 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
20c70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
20c80 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
20c90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
20ca0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
20cb0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
20cc0 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
20cd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20ce0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
20cf0 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61  RED );.  if( pPa
20d00 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74  ger->dbSize<(int
20d10 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  )pPg->pgno ){.  
20d20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
20d30 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
20d40 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20    if( !MEMDB && 
20d50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
20d60 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61  PENDING_BYTE/pPa
20d70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
20d80 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
20d90 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20  bSize++;.    }. 
20da0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20db0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
20dc0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
20dd0 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61  o mark a data-pa
20de0 67 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20  ge as writable. 
20df0 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65  It uses .** page
20e00 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65  r_write() to ope
20e10 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
20e20 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
20e30 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20  lready open).** 
20e40 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61  and write the pa
20e50 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65  ge *pData to the
20e60 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
20e70 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
20e80 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
20e90 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77  tion and pager_w
20ea0 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74  rite() is that t
20eb0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
20ec0 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20  also deals with 
20ed0 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
20ee0 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65   where 2 or more
20ef0 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e   pages.** fit on
20f00 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
20f10 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63  ector. In this c
20f20 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64  ase all co-resid
20f30 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73  ent pages.** mus
20f40 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  t have been writ
20f50 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
20f60 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72  al file before r
20f70 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
20f80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
20f90 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  te(DbPage *pDbPa
20fa0 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
20fb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67  SQLITE_OK;..  Pg
20fc0 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61  Hdr *pPg = pDbPa
20fd0 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge;.  Pager *pPa
20fe0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
20ff0 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50  r;.  Pgno nPageP
21000 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67  erSector = (pPag
21010 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70  er->sectorSize/p
21020 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
21030 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ;..  pagerEnter(
21040 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
21050 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65  MEMDB && nPagePe
21060 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  rSector>1 ){.   
21070 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
21080 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
21090 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
210a0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
210b0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  file */.    Pgno
210c0 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20   pg1;           
210d0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
210e0 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
210f0 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
21100 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20   on. */.    int 
21110 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
21120 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21130 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
21140 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
21150 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nal */.    int i
21160 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  i;.    int needS
21170 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
21180 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
21190 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68  nc flag to 1. Th
211a0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
211b0 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20   cannot allow a 
211c0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68  journal.    ** h
211d0 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
211e0 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
211f0 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
21200 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
21210 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
21220 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
21230 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  otSync==0 );.   
21240 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
21250 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 1;..    /* 
21260 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d  This trick assum
21270 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  es that both the
21280 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
21290 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20  ector-size are. 
212a0 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
212b0 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20   power of 2. It 
212c0 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67  sets variable pg
212d0 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66  1 to the identif
212e0 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ier.    ** of th
212f0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
21300 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
21310 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
21320 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28    */.    pg1 = (
21330 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20  (pPg->pgno-1) & 
21340 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ~(nPagePerSector
21350 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e  -1)) + 1;..    n
21360 50 61 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69  PageCount = sqli
21370 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
21380 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
21390 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
213a0 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
213b0 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
213c0 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
213d0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31    }else if( (pg1
213e0 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  +nPagePerSector-
213f0 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  1)>nPageCount ){
21400 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
21410 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
21420 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21430 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
21440 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a  erSector;.    }.
21450 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65      assert(nPage
21460 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >0);.    assert(
21470 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b  pg1<=pPg->pgno);
21480 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31  .    assert((pg1
21490 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
214a0 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  o);..    for(ii=
214b0 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
214c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
214d0 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
214e0 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
214f0 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
21500 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
21510 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c  er->aInJournal |
21520 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20  | pg==pPg->pgno 
21530 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70 67  || .          pg
21540 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
21550 69 7a 65 20 7c 7c 20 21 28 70 50 61 67 65 72 2d  ize || !(pPager-
21560 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38  >aInJournal[pg/8
21570 5d 26 28 31 3c 3c 28 70 67 26 37 29 29 29 0a 20  ]&(1<<(pg&7))). 
21580 20 20 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20       ) {.       
21590 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d   if( pg!=PAGER_M
215a0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
215b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
215c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
215d0 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
215e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
215f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21600 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
21610 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
21620 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
21630 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
21640 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
21650 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53             needS
21660 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
21670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21680 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
21690 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
216a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
216b0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
216c0 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65  f( (pPage = page
216d0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
216e0 20 70 67 29 29 20 29 7b 0a 20 20 20 20 20 20 20   pg)) ){.       
216f0 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 65 65 64   if( pPage->need
21700 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
21710 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
21720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21730 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
21740 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  If the PgHdr.nee
21750 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
21760 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65  t for any of the
21770 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20   nPage pages .  
21780 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
21790 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65   pg1, then it ne
217a0 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f  eds to be set fo
217b0 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42  r all of them. B
217c0 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72  ecause.    ** wr
217d0 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20  iting to any of 
217e0 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65  these nPage page
217f0 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65  s may damage the
21800 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20   others, the.   
21810 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
21820 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79   must contain sy
21830 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66  nc()ed copies of
21840 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20   all of them.   
21850 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f   ** before any o
21860 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72  f them can be wr
21870 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
21880 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
21890 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
218a0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
218b0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
218c0 61 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b  age && needSync;
218d0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
218e0 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70  PgHdr *pPage = p
218f0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
21900 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20  er, pg1+ii);.   
21910 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29       if( pPage )
21920 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63   pPage->needSync
21930 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
21940 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
21950 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  r->needSync);.  
21960 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
21970 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
21980 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  nc==1 );.    pPa
21990 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
219a0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
219b0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
219c0 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  e(pDbPage);.  }.
219d0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
219e0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
219f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
21a00 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
21a10 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
21a20 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
21a30 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
21a40 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
21a50 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
21a60 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
21a70 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
21a80 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
21a90 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
21aa0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
21ab0 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
21ac0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
21ad0 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
21ae0 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
21af0 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e  Pg->dirty;.}.#en
21b00 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
21b10 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a  ITE_OMIT_VACUUM.
21b20 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
21b30 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73  e content of a s
21b40 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20  ingle page with 
21b50 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
21b60 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20  in the third.** 
21b70 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
21b80 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76 65   sqlite3PagerOve
21b90 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  rwrite(Pager *pP
21ba0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
21bb0 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20   void *pData){. 
21bc0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
21bd0 6e 74 20 72 63 3b 0a 0a 20 20 70 61 67 65 72 45  nt rc;..  pagerE
21be0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
21bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21c00 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  rGet(pPager, pgn
21c10 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20  o, &pPg);.  if( 
21c20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21c30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21c40 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29  3PagerWrite(pPg)
21c50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
21c60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21c70 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65 33 50   memcpy(sqlite3P
21c80 61 67 65 72 47 65 74 44 61 74 61 28 70 50 67 29  agerGetData(pPg)
21c90 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
21ca0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
21cb0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
21cc0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
21cd0 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
21ce0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
21cf0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
21d00 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
21d10 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
21d20 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
21d30 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
21d40 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
21d50 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
21d60 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
21d70 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
21d80 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
21d90 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
21da0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
21db0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
21dc0 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
21dd0 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
21de0 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
21df0 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
21e00 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
21e10 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
21e20 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
21e30 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
21e40 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
21e50 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
21e60 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
21e70 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
21e80 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
21e90 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
21ea0 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
21eb0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
21ec0 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
21ed0 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
21ee0 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
21ef0 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
21f00 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
21f10 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
21f20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
21f30 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
21f40 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
21f50 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73  , set the always
21f60 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f  Rollback flag to
21f70 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71   true..** Subseq
21f80 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
21f90 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
21fa0 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65  llback() for the
21fb0 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69   same page.** wi
21fc0 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65  ll thereafter be
21fd0 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
21fe0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
21ff0 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a  avoid a problem.
22000 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20  ** where a page 
22010 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64  with data is add
22020 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
22030 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61  st during one pa
22040 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73  rt of.** a trans
22050 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f  action then remo
22060 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ved from the fre
22070 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c  elist during a l
22080 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ater part.** of 
22090 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
220a0 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
220b0 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
220c0 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74  urpose.  When it
220d0 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64  .** is first add
220e0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
220f0 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
22100 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65   is called.  Whe
22110 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65  n reused,.** the
22120 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
22130 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74  tRollback() rout
22140 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
22150 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 0a  But because the.
22160 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ** page contains
22170 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20   critical data, 
22180 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
22190 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73   be sure it gets
221a0 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
221b0 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65 20  in spite of the 
221c0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
221d0 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  Rollback() call.
221e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
221f0 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44  PagerDontWrite(D
22200 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
22210 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
22220 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
22230 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
22240 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d  pPager;..  if( M
22250 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  EMDB ) return;. 
22260 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
22270 65 72 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61  er);.  pPg->alwa
22280 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
22290 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
222a0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d   && !pPager->stm
222b0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73  tInUse ){.    as
222c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
222d0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
222e0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
222f0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e  ger->dbSize==(in
22300 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70  t)pPg->pgno && p
22310 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
22320 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
22330 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
22340 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68  this pages is th
22350 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74  e last page in t
22360 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  he file and the 
22370 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20  file has grown. 
22380 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74       ** during t
22390 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
223a0 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20  action, then do 
223b0 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67  NOT mark the pag
223c0 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20  e as clean..    
223d0 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61    ** When the da
223e0 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77  tabase file grow
223f0 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20  s, we must make 
22400 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61  sure that the la
22410 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  st page.      **
22420 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74   gets written at
22430 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74   least once so t
22440 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c  hat the disk fil
22450 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  e will be the co
22460 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73  rrect.      ** s
22470 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e  ize. If you do n
22480 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61  ot write this pa
22490 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ge and the size 
224a0 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  of the file.    
224b0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b    ** on the disk
224c0 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74   ends up being t
224d0 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63  oo small, that c
224e0 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
224f0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  ase.      ** cor
22500 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74  ruption during t
22510 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74  he next transact
22520 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
22530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
22540 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54  AGERTRACE3("DONT
22550 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
22560 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
22570 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
22580 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  er));.      IOTR
22590 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25  ACE(("CLEAN %p %
225a0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
225b0 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20  g->pgno)).      
225c0 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
225d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
225e0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
225f0 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
22600 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
22610 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
22620 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  }.  }.  pagerLea
22630 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ve(pPager);.}../
22640 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
22650 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
22660 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
22670 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
22680 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
22690 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
226a0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
226b0 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
226c0 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
226d0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
226e0 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
226f0 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
22700 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
22710 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
22720 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  rnal..**.** If w
22730 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61  e have not yet a
22740 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65  ctually read the
22750 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
22760 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65   page (if.** the
22770 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
22780 66 6c 61 67 20 69 73 20 73 65 74 29 20 74 68 65  flag is set) the
22790 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
227a0 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65  cts as a promise
227b0 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c  .** that we will
227c0 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72   never need to r
227d0 65 61 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ead the page con
227e0 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  tent in the futu
227f0 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65  re..** so the ne
22800 65 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20  edRead flag can 
22810 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 74 68  be cleared at th
22820 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69  is point..*/.voi
22830 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
22840 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67  ntRollback(DbPag
22850 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
22860 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
22870 70 50 61 67 65 72 3b 0a 0a 20 20 70 61 67 65 72  pPager;..  pager
22880 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
22890 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
228a0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
228b0 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20  SERVED );.  if( 
228c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
228d0 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pen==0 ) return;
228e0 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
228f0 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
22900 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
22910 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20  back || MEMDB ) 
22920 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70  return;.  if( !p
22930 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
22940 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
22950 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
22960 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  bSize ){.    ass
22970 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
22980 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
22990 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
229a0 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
229b0 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
229c0 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e  no&7);.    pPg->
229d0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
229e0 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64     pPg->needRead
229f0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
22a00 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
22a10 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
22a20 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
22a30 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
22a40 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d  ->pgno&7);.    }
22a50 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33  .    PAGERTRACE3
22a60 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  ("DONT_ROLLBACK 
22a70 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
22a80 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
22a90 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
22aa0 20 20 20 49 4f 54 52 41 43 45 28 28 22 47 41 52     IOTRACE(("GAR
22ab0 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70  BAGE %p %d\n", p
22ac0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
22ad0 29 29 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  )).  }.  if( pPa
22ae0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a  ger->stmtInUse .
22af0 20 20 20 26 26 20 21 70 61 67 65 49 6e 53 74 61     && !pageInSta
22b00 74 65 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20  tement(pPg) .   
22b10 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
22b20 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
22b30 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 61 73  ize .  ){.    as
22b40 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
22b50 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
22b60 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
22b70 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
22b80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22b90 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
22ba0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
22bb0 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
22bc0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
22bd0 26 37 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  &7);.  }.  pager
22be0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d  Leave(pPager);.}
22bf0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
22c00 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
22c10 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
22c20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
22c30 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a  hange-counter,.*
22c40 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65  * stored at byte
22c50 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72   24 of the pager
22c60 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
22c70 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
22c80 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
22c90 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
22ca0 20 69 73 44 69 72 65 63 74 29 7b 0a 20 20 50 67   isDirect){.  Pg
22cb0 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75  Hdr *pPgHdr;.  u
22cc0 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
22cd0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
22ce0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
22cf0 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
22d00 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20  ountDone ){.    
22d10 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
22d20 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
22d30 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  riting. */.    r
22d40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
22d50 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
22d60 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
22d70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22d80 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
22d90 20 69 66 28 20 21 69 73 44 69 72 65 63 74 20 29   if( !isDirect )
22da0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
22db0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
22dc0 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 69 66  PgHdr);.      if
22dd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22de0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
22df0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
22e00 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
22e10 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
22e20 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
22e30 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
22e40 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
22e50 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
22e60 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
22e70 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61  leVers);.    cha
22e80 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
22e90 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
22ea0 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
22eb0 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20  TA(pPgHdr))+24, 
22ec0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
22ed0 0a 0a 20 20 20 20 69 66 28 20 69 73 44 69 72 65  ..    if( isDire
22ee0 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64  ct && pPager->fd
22ef0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
22f00 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
22f10 7a 42 75 66 20 3d 20 50 47 48 44 52 5f 54 4f 5f  zBuf = PGHDR_TO_
22f20 44 41 54 41 28 70 50 67 48 64 72 29 3b 0a 20 20  DATA(pPgHdr);.  
22f30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22f40 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
22f50 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
22f60 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a  ->pageSize, 0);.
22f70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
22f80 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
22f90 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
22fa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
22fb0 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ef(pPgHdr);.    
22fc0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
22fd0 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d  untDone = 1;.  }
22fe0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22ff0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
23000 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
23010 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
23020 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
23030 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
23040 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
23050 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
23060 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
23070 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
23080 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
23090 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
230a0 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
230b0 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
230c0 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
230d0 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
230e0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
230f0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
23100 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
23110 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
23120 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c  urnal is synced,
23130 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
23140 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
23150 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23160 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
23170 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54  e file synced. T
23180 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
23190 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f  at.** remains to
231a0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
231b0 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65  saction is to de
231c0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
231d0 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73   file (or.** mas
231e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
231f0 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
23200 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
23210 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
23220 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
23230 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
23240 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
23250 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
23260 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
23270 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a  seOne() call..**
23280 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
23290 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a   nTrunc is non-z
232a0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61  ero, then the pa
232b0 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ger file is trun
232c0 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75  cated to.** nTru
232d0 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69  nc pages (this i
232e0 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  s used by auto-v
232f0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29  acuum databases)
23300 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23310 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
23320 4f 6e 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  One(Pager *pPage
23330 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
23340 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72  Master, Pgno nTr
23350 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  unc){.  int rc =
23360 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
23370 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41  AGERTRACE4("DATA
23380 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
23390 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54  %s zMaster=%s nT
233a0 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  runc=%d\n", .   
233b0 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
233c0 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  name, zMaster, n
233d0 54 72 75 6e 63 29 3b 0a 20 20 70 61 67 65 72 45  Trunc);.  pagerE
233e0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 0a 20  nter(pPager);.. 
233f0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
23400 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
23410 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
23420 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
23430 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66  , or this.  ** f
23440 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
23450 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
23460 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
23470 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
23480 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
23490 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42  SYNCED && !MEMDB
234a0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74   && pPager->dirt
234b0 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67  yCache ){.    Pg
234c0 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65  Hdr *pPg;..#ifde
234d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
234e0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
234f0 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d 77   /* The atomic-w
23500 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
23510 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
23520 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20   all of the.    
23530 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  ** following are
23540 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20   true:.    **.  
23550 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 66 69    **    + The fi
23560 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
23570 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ts the atomic-wr
23580 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72  ite property for
23590 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f  .    **      blo
235a0 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
235b0 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a  -size, and.    *
235c0 2a 20 20 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d  *    + This comm
235d0 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  it is not part o
235e0 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  f a multi-file t
235f0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
23600 20 20 20 20 2a 2a 20 20 20 20 2b 20 45 78 61 63      **    + Exac
23610 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73  tly one page has
23620 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
23630 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  nd store in the 
23640 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
23650 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
23660 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
23670 63 61 6e 20 62 65 20 75 73 65 64 2c 20 74 68 65  can be used, the
23680 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
23690 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20  le will never.  
236a0 20 20 2a 2a 20 62 65 20 63 72 65 61 74 65 64 20    ** be created 
236b0 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63  for this transac
236c0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
236d0 20 69 6e 74 20 75 73 65 41 74 6f 6d 69 63 57 72   int useAtomicWr
236e0 69 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20  ite = (.        
236f0 21 7a 4d 61 73 74 65 72 20 26 26 20 0a 20 20 20  !zMaster && .   
23700 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
23710 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66  rnalOff==jrnlBuf
23720 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20  ferSize(pPager) 
23730 26 26 20 0a 20 20 20 20 20 20 20 20 6e 54 72 75  && .        nTru
23740 6e 63 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20  nc==0 && .      
23750 20 20 28 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44    (0==pPager->pD
23760 69 72 74 79 20 7c 7c 20 30 3d 3d 70 50 61 67 65  irty || 0==pPage
23770 72 2d 3e 70 44 69 72 74 79 2d 3e 70 44 69 72 74  r->pDirty->pDirt
23780 79 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  y).    );.    if
23790 28 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65  ( useAtomicWrite
237a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   ){.      /* Upd
237b0 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69 65  ate the nRec fie
237c0 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ld in the journa
237d0 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
237e0 20 69 6e 74 20 6f 66 66 73 65 74 20 3d 20 70 50   int offset = pP
237f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
23800 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
23810 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20  alMagic);.      
23820 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
23830 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20 72  Rec==1);.      r
23840 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
23850 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 66  pPager->jfd, off
23860 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  set, pPager->nRe
23870 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  c);..      /* Up
23880 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65  date the db file
23890 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e   change counter.
238a0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
238b0 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 0a  all will modify.
238c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 2d        ** the in-
238d0 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
238e0 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  ation of page 1 
238f0 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75  to include the u
23900 70 64 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  pdated.      ** 
23910 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61  change counter a
23920 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61  nd then write pa
23930 67 65 20 31 20 64 69 72 65 63 74 6c 79 20 74 6f  ge 1 directly to
23940 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
23950 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65 63      ** file. Bec
23960 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d  ause of the atom
23970 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
23980 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69  y of the host fi
23990 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20 20  le-system, .    
239a0 20 20 2a 2a 20 74 68 69 73 20 69 73 20 73 61 66    ** this is saf
239b0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
239c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
239d0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
239e0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
239f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
23a00 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
23a10 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
23a20 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  fd);.      if( r
23a30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
23a40 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
23a50 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 75     }..    if( !u
23a60 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 29 0a  seAtomicWrite ).
23a70 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
23a80 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
23a90 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
23aa0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
23ab0 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20  itten to the.   
23ac0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
23ad0 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69  , then no sync i
23ae0 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  s required. This
23af0 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74   happens when it
23b00 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   is.    ** writt
23b10 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  en, then the pro
23b20 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70  cess fails to up
23b30 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
23b40 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20  ERVED to an.    
23b50 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
23b60 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65  k. The next time
23b70 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69   the process tri
23b80 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  es to commit the
23b90 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
23ba0 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65  ion the m-j name
23bb0 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
23bc0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e  dy been written.
23bd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
23be0 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
23bf0 65 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  er ){.      asse
23c00 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
23c10 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
23c20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
23c30 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
23c40 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
23c50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23c60 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
23c70 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  xit;.#ifndef SQL
23c80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
23c90 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54  UUM.      if( nT
23ca0 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  runc!=0 ){.     
23cb0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72     /* If this tr
23cc0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61  ansaction has ma
23cd0 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
23ce0 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c  smaller, then al
23cf0 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20 20  l pages.        
23d00 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64  ** being discard
23d10 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61  ed by the trunca
23d20 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69  tion must be wri
23d30 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
23d40 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
23d50 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
23d60 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a          Pgno i;.
23d70 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69          int iSki
23d80 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  p = PAGER_MJ_PGN
23d90 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  O(pPager);.     
23da0 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63     for( i=nTrunc
23db0 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f  +1; i<=pPager->o
23dc0 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29  rigDbSize; i++ )
23dd0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
23de0 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  !(pPager->aInJou
23df0 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c  rnal[i/8] & (1<<
23e00 28 69 26 37 29 29 29 20 26 26 20 69 21 3d 69 53  (i&7))) && i!=iS
23e10 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kip ){.         
23e20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
23e30 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
23e40 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20  i, &pPg);.      
23e50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23e60 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
23e70 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
23e80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23e90 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
23ea0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
23eb0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
23ec0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  (pPg);.         
23ed0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23ee0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
23ef0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
23f00 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20   }.        } .  
23f10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
23f20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
23f30 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
23f40 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
23f50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23f60 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
23f70 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20  _exit;.      rc 
23f80 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
23f90 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
23fa0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23fb0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
23fc0 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  xit;..#ifndef SQ
23fd0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
23fe0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72  CUUM.    if( nTr
23ff0 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc!=0 ){.      
24000 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24010 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  rTruncate(pPager
24020 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20  , nTrunc);.     
24030 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24040 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
24050 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  xit;.    }.#endi
24060 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  f..    /* Write 
24070 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
24080 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
24090 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  file */.    pPg 
240a0 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
240b0 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
240c0 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  er);.    rc = pa
240d0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
240e0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  st(pPg);.    if(
240f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24100 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  {.      while( p
24110 50 67 20 26 26 20 21 70 50 67 2d 3e 64 69 72 74  Pg && !pPg->dirt
24120 79 20 29 7b 20 70 50 67 20 3d 20 70 50 67 2d 3e  y ){ pPg = pPg->
24130 70 44 69 72 74 79 3b 20 7d 0a 20 20 20 20 20 20  pDirty; }.      
24140 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
24150 20 70 50 67 3b 0a 20 20 20 20 20 20 67 6f 74 6f   pPg;.      goto
24160 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
24170 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
24180 69 72 74 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  irty = 0;..    /
24190 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
241a0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
241b0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
241c0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
241d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
241e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
241f0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
24200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
24210 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c  ACE(("DBSYNC %p\
24220 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20  n", pPager))..  
24230 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
24240 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a  = PAGER_SYNCED;.
24250 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44    }else if( MEMD
24260 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29  B && nTrunc!=0 )
24270 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
24280 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
24290 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b  pPager, nTrunc);
242a0 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a  .  }..sync_exit:
242b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
242c0 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
242d0 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  ){.    /* pager_
242e0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
242f0 65 72 28 29 20 6d 61 79 20 61 74 74 65 6d 70 74  er() may attempt
24300 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65 78   to obtain an ex
24310 63 6c 75 73 69 76 65 0a 20 20 20 20 20 2a 20 6c  clusive.     * l
24320 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68 65  ock to spill the
24330 20 63 61 63 68 65 20 61 6e 64 20 72 65 74 75 72   cache and retur
24340 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e  n IOERR_BLOCKED.
24350 20 42 75 74 20 73 69 6e 63 65 20 0a 20 20 20 20   But since .    
24360 20 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63   * there is no c
24370 68 61 6e 63 65 20 74 68 65 20 63 61 63 68 65 20  hance the cache 
24380 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c  is inconsistent,
24390 20 69 74 27 73 0a 20 20 20 20 20 2a 20 62 65 74   it's.     * bet
243a0 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ter to return SQ
243b0 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 20  LITE_BUSY..     
243c0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
243d0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70  TE_BUSY;.  }.  p
243e0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
243f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
24400 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
24410 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
24420 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
24430 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
24440 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
24450 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
24460 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
24470 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
24480 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
24490 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
244a0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
244b0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
244c0 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
244d0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
244e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
244f0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
24500 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
24510 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
24520 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
24530 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
24540 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
24550 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
24560 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
24570 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
24580 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
24590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
245a0 4f 52 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 45  OR;.  }.  pagerE
245b0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
245c0 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d  PAGERTRACE2("COM
245d0 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
245e0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
245f0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
24600 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
24610 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
24620 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69  pPager);.    whi
24630 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  le( pPg ){.     
24640 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
24650 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
24660 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
24670 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
24680 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20  ry(pHist);.     
24690 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
246a0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
246b0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
246c0 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d   pHist->inStmt =
246d0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
246e0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
246f0 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
24700 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
24710 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
24720 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69    pPg = pPg->pDi
24730 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rty;.    }.    p
24740 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
24750 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  0;.#ifndef NDEBU
24760 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  G.    for(pPg=pP
24770 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
24780 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
24790 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
247a0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
247b0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
247c0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
247d0 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
247e0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
247f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
24800 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
24810 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
24820 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
24830 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
24840 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
24850 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
24860 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
24870 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
24880 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
24890 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
248a0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21  journalOpen || !
248b0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
248c0 68 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  he );.  assert( 
248d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
248e0 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21  AGER_SYNCED || !
248f0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
24900 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  he );.  rc = pag
24910 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
24920 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  on(pPager);.  rc
24930 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
24940 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 70 61  Pager, rc);.  pa
24950 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
24960 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
24970 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
24980 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
24990 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
249a0 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
249b0 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20  SHARED mode..** 
249c0 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  All in-memory ca
249d0 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74  che pages revert
249e0 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e   to their origin
249f0 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73  al data contents
24a00 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ..** The journal
24a10 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
24a20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24a30 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65  cannot fail unle
24a40 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ss some other pr
24a50 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
24a60 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  lowing.** the co
24a70 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72  rrect locking pr
24a80 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73  otocol or unless
24a90 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
24aa0 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
24ab0 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65  g trash into the
24ac0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53   journal file (S
24ad0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f  QLITE_CORRUPT) o
24ae0 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72  r.** unless a pr
24af0 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ior malloc() fai
24b00 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  led (SQLITE_NOME
24b10 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  M).  Appropriate
24b20 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20   error.** codes 
24b30 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72  are returned for
24b40 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73   all these occas
24b50 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65  ions.  Otherwise
24b60 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
24b70 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
24b80 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
24b90 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
24ba0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
24bb0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
24bc0 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
24bd0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
24be0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
24bf0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
24c00 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72      for(p=pPager
24c10 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
24c20 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
24c30 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
24c40 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
24c50 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62   !p->alwaysRollb
24c60 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ack );.      if(
24c70 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20   !p->dirty ){.  
24c80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
24c90 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
24ca0 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
24cb0 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b  ager))->pOrig );
24cc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
24cd0 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
24ce0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
24cf0 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74   pPager))->pStmt
24d00 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
24d10 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
24d20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
24d30 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
24d40 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
24d50 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
24d60 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
24d70 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
24d80 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  , pHist->pOrig, 
24d90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
24da0 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
24db0 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b  TRACE3("ROLLBACK
24dc0 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e  -PAGE %d of %d\n
24dd0 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
24de0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
24df0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24e00 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
24e10 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e  PAGE %d is clean
24e20 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   on %d\n", p->pg
24e30 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
24e40 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er));.      }.  
24e50 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
24e60 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
24e70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
24e80 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20     p->inJournal 
24e90 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74  = 0;.      pHist
24ea0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
24eb0 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76      pHist->pPrev
24ec0 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e  Stmt = pHist->pN
24ed0 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
24ee0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
24ef0 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
24f00 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
24f10 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72 2d  niter(p, pPager-
24f20 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
24f30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
24f40 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
24f50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
24f60 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
24f70 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
24f80 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
24f90 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e  ;.    pager_trun
24fa0 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
24fb0 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
24fc0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
24fd0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
24fe0 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
24ff0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25000 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 61  TE_OK;.  }..  pa
25010 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
25020 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
25030 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
25040 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
25050 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
25060 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
25070 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
25080 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
25090 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
250a0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
250b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
250c0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
250d0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
250e0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
250f0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
25100 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
25110 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61      pager_playba
25120 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
25130 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 4c 65     }.    pagerLe
25140 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
25150 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
25160 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
25170 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
25180 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
25190 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
251a0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
251b0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
251c0 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70   0);.    rc2 = p
251d0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
251e0 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
251f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25200 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
25210 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc2;.    }.  }
25220 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
25230 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
25240 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
25250 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  /* pager_reset(p
25260 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61  Pager); */.  pPa
25270 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
25280 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
25290 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
252a0 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65  g a ROLLBACK, we
252b0 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74   can no longer t
252c0 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20  rust the pager. 
252d0 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
252e0 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
252f0 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
25300 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
25310 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65  r .  ** persiste
25320 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  nt..  */.  rc = 
25330 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
25340 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72  er, rc);.  pager
25350 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
25360 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25370 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
25380 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
25390 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
253a0 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
253b0 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
253c0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
253d0 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
253e0 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
253f0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
25400 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
25410 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
25420 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
25430 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
25440 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
25450 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
25460 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
25470 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
25480 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
25490 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
254a0 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65  ->nRef;.}..#ifde
254b0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
254c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
254d0 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
254e0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
254f0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
25500 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74  sqlite3PagerStat
25510 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
25520 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  {.  static int a
25530 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  [11];.  a[0] = p
25540 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
25550 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
25560 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
25570 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
25580 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
25590 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
255a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
255b0 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
255c0 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20  errCode;.  a[6] 
255d0 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
255e0 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
255f0 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
25600 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20   0;  /* Used to 
25610 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c  be pPager->nOvfl
25620 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61   */.  a[9] = pPa
25630 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b  ger->nRead;.  a[
25640 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57  10] = pPager->nW
25650 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61  rite;.  return a
25660 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
25670 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d  * Set the statem
25680 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69  ent rollback poi
25690 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
256a0 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
256b0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
256c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
256d0 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20  rnal already.** 
256e0 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61  open.  A new sta
256f0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
25700 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63  s created that c
25710 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f  an be used to ro
25720 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65  llback.** change
25730 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51  s of a single SQ
25740 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e  L command within
25750 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61   a larger transa
25760 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
25770 20 69 6e 74 20 70 61 67 65 72 53 74 6d 74 42 65   int pagerStmtBe
25780 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
25790 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
257a0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
257b0 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20  >stmtInUse );.  
257c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
257d0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
257e0 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RED );.  assert(
257f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
25800 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41  =0 );.  PAGERTRA
25810 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20  CE2("STMT-BEGIN 
25820 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
25830 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
25840 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
25850 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
25860 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
25870 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
25880 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65  ->dbSize;.    re
25890 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
258a0 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
258b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
258c0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
258d0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a  mtAutoopen = 1;.
258e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
258f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
25900 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
25910 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 61 67  nalOpen );.  pag
25920 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
25930 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  .  pPager->aInSt
25940 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  mt = sqlite3Mall
25950 6f 63 5a 65 72 6f 28 20 70 50 61 67 65 72 2d 3e  ocZero( pPager->
25960 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
25970 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
25980 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
25990 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29  er->aInStmt==0 )
259a0 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  {.    /* sqlite3
259b0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
259c0 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
259d0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
259e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
259f0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
25a00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
25a10 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
25a20 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73  >jfd, &pPager->s
25a30 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
25a40 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
25a50 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
25a60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25a70 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61  stmtJSize == pPa
25a80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
25a90 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67  );.#endif.  pPag
25aa0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
25ab0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
25ac0 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ff;.  pPager->st
25ad0 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
25ae0 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  >dbSize;.  pPage
25af0 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
25b00 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
25b10 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d  tCksum = pPager-
25b20 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66  >cksumInit;.  if
25b30 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  ( !pPager->stmtO
25b40 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
25b50 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
25b60 74 65 6d 70 28 70 50 61 67 65 72 2d 3e 70 56 66  temp(pPager->pVf
25b70 73 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  s, pPager->stfd,
25b80 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
25b90 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
25ba0 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50  n_failed;.    pP
25bb0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
25bc0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
25bd0 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
25be0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
25bf0 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74  InUse = 1;.  ret
25c00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
25c10 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c  .stmt_begin_fail
25c20 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72  ed:.  if( pPager
25c30 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20  ->aInStmt ){.   
25c40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
25c50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a  ager->aInStmt);.
25c60 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
25c70 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  tmt = 0;.  }.  r
25c80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
25c90 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
25ca0 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
25cb0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
25cc0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
25cd0 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ger);.  rc = pag
25ce0 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67  erStmtBegin(pPag
25cf0 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  er);.  pagerLeav
25d00 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
25d10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25d20 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d   Commit a statem
25d30 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
25d40 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
25d50 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
25d60 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ){.  pagerEnter(
25d70 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
25d80 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
25d90 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
25da0 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  Pg, *pNext;.    
25db0 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d  PAGERTRACE2("STM
25dc0 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  T-COMMIT %d\n", 
25dd0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
25de0 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ;.    if( !MEMDB
25df0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c   ){.      /* sql
25e00 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
25e10 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
25e20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
25e30 33 5f 66 72 65 65 28 20 70 50 61 67 65 72 2d 3e  3_free( pPager->
25e40 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  aInStmt );.     
25e50 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
25e60 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
25e70 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
25e80 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
25e90 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
25ea0 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
25eb0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
25ec0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
25ed0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ger);.        pN
25ee0 65 78 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  ext = pHist->pNe
25ef0 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  xtStmt;.        
25f00 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69  assert( pHist->i
25f10 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20  nStmt );.       
25f20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d   pHist->inStmt =
25f30 20 30 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   0;.        pHis
25f40 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
25f50 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
25f60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
25f70 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d  ite3_free(pHist-
25f80 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  >pStmt);.       
25f90 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
25fa0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
25fb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
25fc0 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70  tNRec = 0;.    p
25fd0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
25fe0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
25ff0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  ->pStmt = 0;.  }
26000 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
26010 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70  utoopen = 0;.  p
26020 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
26030 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
26040 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26050 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  Rollback a state
26060 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
26070 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c  ite3PagerStmtRol
26080 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
26090 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
260a0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
260b0 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
260c0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
260d0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32  .    PAGERTRACE2
260e0 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20  ("STMT-ROLLBACK 
260f0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
26100 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
26110 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
26120 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
26130 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
26140 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  st;.      for(pP
26150 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
26160 20 70 50 67 3b 20 70 50 67 3d 70 48 69 73 74 2d   pPg; pPg=pHist-
26170 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20  >pNextStmt){.   
26180 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
26190 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
261a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
261b0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
261c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
261d0 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
261e0 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d  ATA(pPg), pHist-
261f0 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e  >pStmt, pPager->
26200 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
26210 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
26220 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
26230 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74  .          pHist
26240 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
26250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
26260 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
26270 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  ize = pPager->st
26280 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61  mtSize;.      pa
26290 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
262a0 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
262b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
262c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
262d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74     rc = pager_st
262e0 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  mt_playback(pPag
262f0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
26300 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
26310 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
26320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
26330 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
26340 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
26350 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61  toopen = 0;.  pa
26360 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
26370 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
26380 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
26390 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
263a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
263b0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
263c0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
263d0 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  erFilename(Pager
263e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
263f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
26400 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
26410 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
26420 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
26430 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
26440 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
26450 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61  3PagerDirname(Pa
26460 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
26470 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
26480 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a  Directory;.}../*
26490 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
264a0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
264b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
264c0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
264d0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75  *sqlite3PagerJou
264e0 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
264f0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
26500 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
26510 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
26520 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
26530 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
26540 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
26550 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
26560 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
26570 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
26580 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
26590 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  t sqlite3PagerNo
265a0 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
265b0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
265c0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a  ager->noSync;.}.
265d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
265e0 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53  AS_CODEC./*.** S
265f0 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
26600 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
26610 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
26620 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
26630 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
26640 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
26650 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
26660 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
26670 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
26680 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
26690 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
266a0 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
266b0 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Arg;.}.#endif..#
266c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
266d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
266e0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67  .** Move the pag
266f0 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f  e pPg to locatio
26700 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69  n pgno in the fi
26710 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  le. .**.** There
26720 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65   must be no refe
26730 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
26740 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  ge previously lo
26750 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f  cated at.** pgno
26760 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20   (which we call 
26770 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74  pPgOld) though t
26780 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  hat page is allo
26790 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20  wed to be.** in 
267a0 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70  cache.  If the p
267b0 61 67 65 20 70 72 65 76 69 6f 75 73 20 6c 6f 63  age previous loc
267c0 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20  ated at pgno is 
267d0 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
267e0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
267f0 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
26800 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62  t put there by b
26810 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
26820 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73  **.** References
26830 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67   to the page pPg
26840 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55   remain valid. U
26850 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d  pdating any.** m
26860 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
26870 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e  ted with pPg (i.
26880 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
26890 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
268a0 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
268b0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
268c0 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
268d0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
268e0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
268f0 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
26900 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
26910 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
26920 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65  s called. It use
26930 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69  d to be.** requi
26940 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65  red that a state
26950 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
26960 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c   was not active,
26970 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69   but this restri
26980 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
26990 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54  n removed (CREAT
269a0 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f  E INDEX needs to
269b0 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65   move a page whe
269c0 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  n a statement.**
269d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
269e0 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20  active)..*/.int 
269f0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
26a00 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
26a10 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c  er, DbPage *pPg,
26a20 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
26a30 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f  gHdr *pPgOld;  /
26a40 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67  * The page being
26a50 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f   overwritten. */
26a60 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f  .  int h;.  Pgno
26a70 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
26a80 30 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72  0;..  pagerEnter
26a90 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
26aa0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
26ab0 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
26ac0 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  5("MOVE %d page 
26ad0 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
26ae0 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
26af0 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
26b00 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
26b10 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
26b20 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52  c, pgno);.  IOTR
26b30 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64  ACE(("MOVE %p %d
26b40 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
26b50 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29  pPg->pgno, pgno)
26b60 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63  )..  pager_get_c
26b70 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69  ontent(pPg);.  i
26b80 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
26b90 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63   ){.    needSync
26ba0 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
26bb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
26bc0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
26bd0 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72  (int)pgno>pPager
26be0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
26bf0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
26c00 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73  >dirty );.    as
26c10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
26c20 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20  edSync );.  }.. 
26c30 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66   /* Unlink pPg f
26c40 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68  rom it's hash-ch
26c50 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ain */.  unlinkH
26c60 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
26c70 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   pPg);..  /* If 
26c80 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
26c90 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70  ns a page with p
26ca0 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c  age-number pgno,
26cb0 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20   remove it.  ** 
26cc0 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
26cd0 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
26ce0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
26cf0 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
26d00 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
26d10 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
26d20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
26d30 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
26d40 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
26d50 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
26d60 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e  e..  */.  pPg->n
26d70 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
26d80 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
26d90 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
26da0 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64  o);.  if( pPgOld
26db0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
26dc0 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20  pPgOld->nRef==0 
26dd0 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73  );.    unlinkHas
26de0 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
26df0 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65  PgOld);.    make
26e00 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20  Clean(pPgOld);. 
26e10 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
26e20 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53   = pPgOld->needS
26e30 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ync;.  }else{.  
26e40 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
26e50 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
26e60 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
26e70 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  l && (int)pgno<=
26e80 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
26e90 7a 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 69  ze ){.    pPg->i
26ea0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 20 28 70 50 61  nJournal =  (pPa
26eb0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
26ec0 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
26ed0 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 7d  gno&7)))!=0;.  }
26ee0 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e 69  else{.    pPg->i
26ef0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
26f00 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
26f10 65 65 64 53 79 6e 63 3d 3d 30 20 7c 7c 20 28 69  eedSync==0 || (i
26f20 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  nt)pgno>pPager->
26f30 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
26f40 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74  }..  /* Change t
26f50 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
26f60 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72  or pPg and inser
26f70 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  t it into the ne
26f80 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f  w hash-chain. */
26f90 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
26fa0 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e  =0 );.  pPg->pgn
26fb0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
26fc0 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
26fd0 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20  nHash-1);.  if( 
26fe0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
26ff0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
27000 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
27010 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
27020 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
27030 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
27040 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  h = pPg;.  }.  p
27050 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
27060 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
27070 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
27080 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50  h[h] = pPg;.  pP
27090 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
270a0 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  ;..  makeDirty(p
270b0 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
270c0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a  irtyCache = 1;..
270d0 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
270e0 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
270f0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
27100 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
27110 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27120 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
27130 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
27140 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
27150 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
27160 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
27170 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
27180 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
27190 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
271a0 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
271b0 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
271c0 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75   ** Pager.aInJou
271d0 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65 65  rnal bit has bee
271e0 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
271f0 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
27200 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20   by loading.    
27210 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ** the page into
27220 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
27230 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
27240 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
27250 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
27260 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
27270 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
27280 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
27290 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
272a0 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
272b0 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
272c0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
272d0 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
272e0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48   int rc;.    PgH
272f0 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20  dr *pPgHdr;.    
27300 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27310 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
27320 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
27330 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  rGet(pPager, nee
27340 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48  dSyncPgno, &pPgH
27350 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
27360 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
27370 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
27380 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
27390 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65  ;.    pPgHdr->ne
273a0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
273b0 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61  pPgHdr->inJourna
273c0 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44  l = 1;.    makeD
273d0 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20  irty(pPgHdr);.  
273e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
273f0 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
27400 0a 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ..  pagerLeave(p
27410 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
27420 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
27430 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
27440 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
27450 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
27460 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
27470 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
27480 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62  3PagerGetData(Db
27490 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
274a0 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41  turn PGHDR_TO_DA
274b0 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  TA(pPg);.}../*.*
274c0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
274d0 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e  er to the Pager.
274e0 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
274f0 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a  "extra" space .*
27500 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
27510 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  g with the speci
27520 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
27530 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
27540 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20  GetExtra(DbPage 
27550 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
27560 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
27570 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28  ager;.  return (
27580 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f  pPager?PGHDR_TO_
27590 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
275a0 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r):0);.}../*.** 
275b0 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
275c0 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
275d0 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
275e0 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
275f0 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
27600 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
27610 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
27620 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
27630 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
27640 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
27650 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
27660 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
27670 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
27680 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
27690 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
276a0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
276b0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
276c0 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
276d0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
276e0 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
276f0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
27700 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
27710 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
27720 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
27730 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
27740 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
27750 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
27760 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
27770 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
27780 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
27790 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
277a0 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
277b0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
277c0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
277d0 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  RMAL.           
277e0 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
277f0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
27800 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
27810 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
27820 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  GMODE_QUERY<0 );
27830 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
27840 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
27850 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  MAL>=0 && PAGER_
27860 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
27870 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66  USIVE>=0 );.  if
27880 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70  ( eMode>=0 && !p
27890 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
278a0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
278b0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65  xclusiveMode = e
278c0 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mode;.  }.  retu
278d0 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  rn (int)pPager->
278e0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d  exclusiveMode;.}
278f0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
27900 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
27910 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
27920 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
27930 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
27940 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c  te of the file l
27950 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65  ock for the give
27960 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20  n pager..** The 
27970 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
27980 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20  one of NO_LOCK, 
27990 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
279a0 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50  ERVED_LOCK,.** P
279b0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20  ENDING_LOCK, or 
279c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
279d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
279e0 67 65 72 4c 6f 63 6b 73 74 61 74 65 28 50 61 67  gerLockstate(Pag
279f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
27a00 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c  eturn sqlite3OsL
27a10 6f 63 6b 53 74 61 74 65 28 70 50 61 67 65 72 2d  ockState(pPager-
27a20 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  >fd);.}.#endif..
27a30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
27a40 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
27a50 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c  a listing of all
27a60 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   referenced page
27a70 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20  s and their ref 
27a80 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  count..*/.void s
27a90 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 64 75  qlite3PagerRefdu
27aa0 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  mp(Pager *pPager
27ab0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
27ac0 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
27ad0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
27ae0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
27af0 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
27b00 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Ref<=0 ) continu
27b10 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e;.    sqlite3De
27b20 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45 20  bugPrintf("PAGE 
27b30 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66  %3d addr=%p nRef
27b40 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  =%d\n", .       
27b50 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52  pPg->pgno, PGHDR
27b60 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
27b70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d  Pg->nRef);.  }.}
27b80 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20  .#endif..#endif 
27b90 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
27ba0 49 53 4b 49 4f 20 2a 2f 0a                       ISKIO */.