/ Hex Artifact Content
Login

Artifact f01e0e577b7b54c3cdba24a30ecc585a805f23fa:


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 33  : pager.c,v 1.33
0350: 35 20 32 30 30 37 2f 30 35 2f 30 34 20 31 33 3a  5 2007/05/04 13:
0360: 31 35 3a 35 36 20 64 72 68 20 45 78 70 20 24 0a  15:56 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 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0440: 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e  DebugPrintf prin
0450: 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  tf.#define PAGER
0460: 54 52 41 43 45 31 28 58 29 20 20 20 20 20 20 20  TRACE1(X)       
0470: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0480: 74 66 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41  tf(X).#define PA
0490: 47 45 52 54 52 41 43 45 32 28 58 2c 59 29 20 20  GERTRACE2(X,Y)  
04a0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
04b0: 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66 69  rintf(X,Y).#defi
04c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
04d0: 2c 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44  ,Y,Z)   sqlite3D
04e0: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a  ebugPrintf(X,Y,Z
04f0: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0500: 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73  RACE4(X,Y,Z,W) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  f(X,Y,Z,W).#defi
0530: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
0540: 2c 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65  ,Y,Z,W,V) sqlite
0550: 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59  3DebugPrintf(X,Y
0560: 2c 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64  ,Z,W,V).#else.#d
0570: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
0580: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47  1(X).#define PAG
0590: 45 52 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64  ERTRACE2(X,Y).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  3(X,Y,Z).#define
05c0: 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c 59   PAGERTRACE4(X,Y
05d0: 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Z,W).#define PA
05e0: 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c  GERTRACE5(X,Y,Z,
05f0: 57 2c 56 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  W,V).#endif../*.
0600: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0610: 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65 20   two macros are 
0620: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
0630: 50 41 47 45 52 54 52 41 43 45 58 28 29 20 6d 61  PAGERTRACEX() ma
0640: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0650: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0660: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0670: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0680: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0690: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
06a0: 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74  as it's argument
06b0: 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  . The.** associa
06c0: 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70  ted file-descrip
06d0: 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  tor is returned.
06e0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20   FILEHANDLEID() 
06f0: 74 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a  takes an OsFile.
0700: 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69 74 27  ** struct as it'
0710: 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  s argument..*/.#
0720: 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70  define PAGERID(p
0730: 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29 29  ) ((int)(p->fd))
0740: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e  .#define FILEHAN
0750: 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74 29  DLEID(fd) ((int)
0760: 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  fd)../*.** The p
0770: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
0780: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0790: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
07a0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
07b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
07c0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
07d0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
07e0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
07f0: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
0830: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
0860: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
0870: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
08a0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
08b0: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
08c0: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
08d0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
08e0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
08f0: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0900: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0910: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0920: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
0930: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
0940: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
0950: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0960: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0990: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
09a0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
09b0: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
09c0: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
09d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
09e0: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
0a10: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
0a20: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
0a30: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0a50: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0a60: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0a70: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0a80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0aa0: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0ab0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
0ac0: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0ae0: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
0af0: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
0b00: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0b30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0b40: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0b50: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0b60: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0b70: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0b90: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0ba0: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0bb0: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
0be0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0bf0: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0c00: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0c10: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0c20: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0c30: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0c40: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0c50: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0c60: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0c70: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0ca0: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0cb0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0cc0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ce0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0cf0: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0d00: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0d30: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0d40: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f 72   is to remove or
0d50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d60: 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61            trunca
0d70: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
0d80: 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ile and the tran
0d90: 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  saction .**     
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74    will be commit
0dc0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
0dd0: 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20  age cache comes 
0de0: 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  up in PAGER_UNLO
0df0: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0e00: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 33  ime a.** sqlite3
0e10: 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75 72  PagerGet() occur
0e20: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0e30: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0e40: 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74  R_SHARED..** Aft
0e50: 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  er all pages hav
0e60: 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  e been released 
0e70: 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67  using sqlite_pag
0e80: 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68  e_unref(),.** th
0e90: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0ea0: 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ons back to PAGE
0eb0: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0ec0: 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61  irst time.** tha
0ed0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0ee0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  ite() is called,
0ef0: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0f00: 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47  itions to.** PAG
0f10: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e  ER_RESERVED.  (N
0f20: 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ote that sqlite3
0f30: 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61 6e  PagerWrite() can
0f40: 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c   only be.** call
0f50: 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e  ed on an outstan
0f60: 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68 20  ding page which 
0f70: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
0f80: 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20  ager must.** be 
0f90: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
0fa0: 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69  before it transi
0fb0: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52  tions to PAGER_R
0fc0: 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41 47  ESERVED.).** PAG
0fd0: 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61 6e  ER_RESERVED mean
0fe0: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
0ff0: 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63 6b  an open rollback
1000: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65   journal..** The
1010: 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50   transition to P
1020: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f  AGER_EXCLUSIVE o
1030: 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e 79  ccurs before any
1040: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1050: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1060: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75 67  base file, thoug
1070: 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  h writes to the 
1080: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
1090: 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68 20  nal occurs with 
10a0: 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45 52  just PAGER_RESER
10b0: 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20 73  VED.  After an s
10c0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
10d0: 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69  ack().** or sqli
10e0: 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
10f0: 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73 74  aseTwo(), the st
1100: 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b 20  ate can go back 
1110: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2c  to PAGER_SHARED,
1120: 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73 74  .** or it can st
1130: 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43 4c  ay at PAGER_EXCL
1140: 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65 20  USIVE if we are 
1150: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
1160: 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65  ess mode..*/.#de
1170: 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43  fine PAGER_UNLOC
1180: 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  K      0.#define
1190: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
11a0: 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61     1   /* same a
11b0: 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  s SHARED_LOCK */
11c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
11d0: 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f  ESERVED    2   /
11e0: 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56  * same as RESERV
11f0: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  ED_LOCK */.#defi
1200: 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ne PAGER_EXCLUSI
1210: 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65  VE   4   /* same
1220: 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   as EXCLUSIVE_LO
1230: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
1240: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
1250: 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  5../*.** If the 
1260: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1270: 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20  RVED_LOCK macro 
1280: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61  is set to true a
1290: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a  t compile-time,.
12a0: 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61  ** then failed a
12b0: 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61  ttempts to get a
12c0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77   reserved lock w
12d0: 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ill invoke the b
12e0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a  usy callback..**
12f0: 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20   This is off by 
1300: 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65  default.  To see
1310: 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74   why, consider t
1320: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
1330: 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75  nario:.** .** Su
1340: 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61  ppose thread A a
1350: 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61  lready has a sha
1360: 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  red lock and wan
1370: 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ts a reserved lo
1380: 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20  ck..** Thread B 
1390: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
13a0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20  served lock and 
13b0: 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69  wants an exclusi
13c0: 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20  ve lock.  If.** 
13d0: 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65  both threads are
13e0: 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73   using their bus
13f0: 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20  y callbacks, it 
1400: 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20  might be a long 
1410: 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f  time.** be for o
1420: 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64  ne of the thread
1430: 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c  s give up and al
1440: 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74  lows the other t
1450: 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75  o proceed..** Bu
1460: 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20  t if the thread 
1470: 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68  trying to get th
1480: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  e reserved lock 
1490: 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79  gives up quickly
14a0: 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72  .** (if it never
14b0: 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73   invokes its bus
14c0: 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e  y callback) then
14d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20   the contention 
14e0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c  will be.** resol
14f0: 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a  ved quickly..*/.
1500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42  #ifndef SQLITE_B
1510: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1520: 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  K.# define SQLIT
1530: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1540: 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 0.#endif../
1550: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1560: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1570: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1580: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1590: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
15a0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
15b0: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
15c0: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
15d0: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
15e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
15f0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
1600: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
1610: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1620: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1630: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1640: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1650: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1660: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1670: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1680: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1690: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
16a0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
16b0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
16c0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
16d0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
16e0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
16f0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
1700: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
1710: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1720: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1730: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1740: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1750: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1760: 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1770: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1780: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
1790: 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74  ntents are writt
17a0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  en into the roll
17b0: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
17c0: 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72  and PgHdr.inJour
17d0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65  nal and PgHdr.ne
17e0: 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20  edSync are set. 
17f0: 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20   Later, once.** 
1800: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1810: 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74   has made it ont
1820: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
1830: 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ce, PgHdr.needSy
1840: 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nc.** is cleared
1850: 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20  .  The modified 
1860: 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77  page cannot be w
1870: 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
1880: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1890: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
18a0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
18b0: 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20   pages has been 
18c0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61  synced to disk a
18d0: 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e  nd the.** PgHdr.
18e0: 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65  needSync has bee
18f0: 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  n cleared..**.**
1900: 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79   The PgHdr.dirty
1910: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
1920: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1930: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1940: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1950: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1960: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1970: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1980: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
19a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
19b0: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
19c0: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
19d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f0: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
1a00: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
1a10: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
1a20: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a40: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
1a50: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1a60: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
1a70: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
1a80: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
1a90: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
1aa0: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64  r.pgno */.  PgHd
1ab0: 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70  r *pNextFree, *p
1ac0: 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72  PrevFree;  /* Fr
1ad0: 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  eelist of pages 
1ae0: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f  where nRef==0 */
1af0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
1b00: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1b10: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
1b20: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
1b30: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
1b60: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
1b70: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
1b80: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1ba0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72  if we need to wr
1bb0: 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73  ite back changes
1bc0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
1bd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1be0: 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75       /* Sync jou
1bf0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74  rnal before writ
1c00: 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f  ing this page */
1c10: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
1c20: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  back;           
1c30: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e    /* Disable Don
1c40: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
1c50: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
1c60: 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20 20 20  8 needRead;     
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c80: 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20 69 66   Read content if
1c90: 20 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73   PagerWrite() is
1ca0: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73 68 6f   called */.  sho
1cb0: 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  rt int nRef;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1cd0: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
1ce0: 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  f this page */. 
1cf0: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20   PgHdr *pDirty, 
1d00: 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20  *pPrevDirty;    
1d10: 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a  /* Dirty pages *
1d20: 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  /.  u32 notUsed;
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73 70 61     /* Buffer spa
1d50: 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ce */.#ifdef SQL
1d60: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1d70: 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a    u32 pageHash;.
1d80: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67  #endif.  /* pPag
1d90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1da0: 65 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20  es of page data 
1db0: 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64  follow this head
1dc0: 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72  er */.  /* Pager
1dd0: 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
1de0: 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c   local data foll
1df0: 6f 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ow the page data
1e00: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f   */.};../*.** Fo
1e10: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f  r an in-memory o
1e20: 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f  nly database, so
1e30: 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  me extra informa
1e40: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
1e50: 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70   about.** each p
1e60: 61 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e  age so that chan
1e70: 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ges can be rolle
1e80: 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61  d back.  (Journa
1e90: 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a  l files are not.
1ea0: 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ** used for in-m
1eb0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1ec0: 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  )  The following
1ed0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1ee0: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
1ef0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54  end of every EXT
1f00: 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d  RA block for in-
1f10: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
1f20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66  ..**.** This inf
1f30: 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68  ormation could h
1f40: 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64  ave been added d
1f50: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50  irectly to the P
1f60: 67 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a  gHdr structure..
1f70: 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77  ** But then it w
1f80: 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20  ould take up an 
1f90: 65 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66  extra 8 bytes of
1fa0: 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72   storage on ever
1fb0: 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20  y PgHdr.** even 
1fc0: 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64  for disk-based d
1fd0: 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74  atabases.  Split
1fe0: 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65  ting it out save
1ff0: 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73  s 8 bytes.  This
2000: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61  .** is only a sa
2010: 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75  vings of 0.8% bu
2020: 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61  t those percenta
2030: 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74  ges add up..*/.t
2040: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
2050: 48 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72  History PgHistor
2060: 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74  y;.struct PgHist
2070: 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69  ory {.  u8 *pOri
2080: 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  g;     /* Origin
2090: 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52  al page text.  R
20a0: 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f  estore to this o
20b0: 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63  n a full rollbac
20c0: 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74  k */.  u8 *pStmt
20d0: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73  ;     /* Text as
20e0: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
20f0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2100: 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
2110: 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  t */.  PgHdr *pN
2120: 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53  extStmt, *pPrevS
2130: 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  tmt;  /* List of
2140: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
2150: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
2160: 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20  */.  u8 inStmt; 
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69      /* TRUE if i
2190: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
21a0: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b  subjournal */.};
21b0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20  ../*.** A macro 
21c0: 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e  used for invokin
21d0: 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74  g the codec if t
21e0: 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23  here is one.*/.#
21f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
2200: 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20  _CODEC.# define 
2210: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20  CODEC1(P,D,N,X) 
2220: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30  if( P->xCodec!=0
2230: 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   ){ P->xCodec(P-
2240: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
2250: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  ); }.# define CO
2260: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
2270: 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63  char*)(P->xCodec
2280: 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d  !=0?P->xCodec(P-
2290: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
22a0: 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  ):D)).#else.# de
22b0: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
22c0: 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  N,X) /* NO-OP */
22d0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
22e0: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
22f0: 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  *)D).#endif../*.
2300: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
2310: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
2320: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
2330: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
2340: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
2350: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2360: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
2370: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
2380: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
2390: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
23a0: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
23b0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
23c0: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
23d0: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
23e0: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
23f0: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
2400: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
2410: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
2420: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
2430: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
2440: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
2450: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
2460: 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  )../*.** A open 
2470: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
2480: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2490: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
24a0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  ture..**.** Page
24b0: 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65  r.errCode may be
24c0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49   set to SQLITE_I
24d0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
24e0: 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53  RUPT, or.** or S
24f0: 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65  QLITE_FULL. Once
2500: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73   one of the firs
2510: 74 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f  t three errors o
2520: 63 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73  ccurs, it persis
2530: 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74  ts.** and is ret
2540: 75 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73  urned as the res
2550: 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a  ult of every maj
2560: 6f 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c  or pager API cal
2570: 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54  l.  The.** SQLIT
2580: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
2590: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
25a0: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
25b0: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
25c0: 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63   the.** next suc
25d0: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
25e0: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
25f0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2600: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54  . Also,.** SQLIT
2610: 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20  E_FULL does not 
2620: 61 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74  affect the sqlit
2630: 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
2640: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
2650: 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74  kup().** APIs, t
2660: 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  hey may still be
2670: 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c   used successful
2680: 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61  ly..*/.struct Pa
2690: 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e  ger {.  u8 journ
26a0: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
26b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
26c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
26d0: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
26e0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
26f0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2700: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2710: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2720: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2730: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
2740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2750: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
2760: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
2770: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
2780: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
2790: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
27a0: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
27b0: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73  dlocks */.  u8 s
27c0: 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  tmtOpen;        
27d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
27e0: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
27f0: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f   subjournal is o
2800: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  pen */.  u8 stmt
2810: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
2820: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
2830: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
2840: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
2850: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75  n */.  u8 stmtAu
2860: 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  toopen;         
2870: 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20     /* Open stmt 
2880: 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69  journal when mai
2890: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
28a0: 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ned*/.  u8 noSyn
28b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28c0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
28d0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
28e0: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
28f0: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
2900: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
2910: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
2920: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
2930: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
2940: 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20  full_fsync;     
2950: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
2960: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e  F_FULLFSYNC when
2970: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
2980: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
2990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29a0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
29b0: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
29c0: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65   etc. */.  u8 te
29d0: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
29e0: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
29f0: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
2a00: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
2a10: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
2a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a30: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
2a40: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
2a50: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
2a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2a70: 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29  ue if an fsync()
2a80: 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68   is needed on th
2a90: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
2aa0: 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20  8 dirtyCache;   
2ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ac0: 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67  ue if cached pag
2ad0: 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  es have changed 
2ae0: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
2af0: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
2b00: 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74   /* Disable Dont
2b10: 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61  Rollback() for a
2b20: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
2b30: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
2b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2b50: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
2b60: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75   file I/O */.  u
2b70: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
2b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2b90: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
2ba0: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2bb0: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
2bc0: 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20  8 doNotSync;    
2bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
2be0: 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75  olean. While tru
2bf0: 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  e, do not spill 
2c00: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75  the cache */.  u
2c10: 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  8 exclusiveMode;
2c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
2c30: 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c  olean. True if l
2c40: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43  ocking_mode==EXC
2c50: 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 63  LUSIVE */.  u8 c
2c60: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
2c80: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
2c90: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
2ca0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 72  nter */.  int er
2cb0: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
2cc0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2cd0: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
2ce0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
2cf0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
2d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d10: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2d20: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
2d30: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
2d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
2d50: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
2d60: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
2d70: 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20    int stmtSize; 
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d90: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
2da0: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
2db0: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
2dc0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2de0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2df0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2e00: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
2e10: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
2e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
2e30: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
2e40: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
2e50: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20  ecksum */.  int 
2e60: 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20  stmtNRec;       
2e70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e80: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
2e90: 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  stmt subjournal 
2ea0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  */.  int nExtra;
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
2ed0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
2ee0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
2ef0: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
2f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2f20: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
2f30: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f50: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2f60: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
2f70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 61   */.  int nMaxPa
2f80: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2f90: 20 20 2f 2a 20 48 69 67 68 20 77 61 74 65 72 20    /* High water 
2fa0: 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a 2f  mark of nPage */
2fb0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  * Number of in-m
2fe0: 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68  emory pages with
2ff0: 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f   PgHdr.nRef>0 */
3000: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3020: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
3030: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c   of pages to hol
3040: 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  d in cache */.  
3050: 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20  u8 *aInJournal; 
3060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3070: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
3080: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
3090: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
30a0: 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20  8 *aInStmt;     
30b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
30c0: 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70  e bit for each p
30d0: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
30e0: 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ase */.  char *z
30f0: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
3100: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3110: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3120: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
3130: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
3140: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3150: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
3160: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63  /.  char *zDirec
3170: 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  tory;           
3180: 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c  /* Directory hol
3190: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  d database and j
31a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
31b0: 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a 6a    OsFile *fd, *j
31c0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
31d0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
31e0: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61  s for database a
31f0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nd journal */.  
3200: 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b 20 20 20  OsFile *stfd;   
3210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3220: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
3230: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
3240: 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20   subjournal*/.  
3250: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
3260: 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50  syHandler;  /* P
3270: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
3280: 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  .busyHandler */.
3290: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c    PgHdr *pFirst,
32a0: 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a   *pLast;      /*
32b0: 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61   List of free pa
32c0: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
32d0: 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20  pFirstSynced;   
32e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72       /* First fr
32f0: 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67 48  ee page with PgH
3300: 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a  dr.needSync==0 *
3310: 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b  /.  PgHdr *pAll;
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3330: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70  /* List of all p
3340: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
3350: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  *pStmt;         
3360: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3370: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
3380: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
3390: 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  al */.  PgHdr *p
33a0: 44 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  Dirty;          
33b0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
33c0: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 2a  ll dirty pages *
33d0: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
33e0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
33f0: 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 20  /* Current byte 
3400: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
3410: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
3420: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
3430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3440: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
3450: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
3460: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73  eader */.  i64 s
3470: 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20  tmtHdrOff;      
3480: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
3490: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
34a0: 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61 74  ritten this stat
34b0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73  ement */.  i64 s
34c0: 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20  tmtCksum;       
34d0: 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49         /* cksumI
34e0: 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65  nit when stateme
34f0: 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20 2a  nt was started *
3500: 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a  /.  i64 stmtJSiz
3510: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3520: 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e  /* Size of journ
3530: 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  al at stmt_begin
3540: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74  () */.  int sect
3550: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
3560: 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73      /* Assumed s
3570: 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e  ector size durin
3580: 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69  g rollback */.#i
3590: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
35a0: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
35b0: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ss;            /
35c0: 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64  * Cache hits and
35d0: 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e   missing */.  in
35e0: 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b  t nRead, nWrite;
35f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
3600: 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64  abase pages read
3610: 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64  /written */.#end
3620: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73  if.  void (*xDes
3630: 74 72 75 63 74 6f 72 29 28 44 62 50 61 67 65 2a  tructor)(DbPage*
3640: 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  ,int); /* Call t
3650: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
3660: 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a   freeing pages *
3670: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
3680: 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c 69 6e  iter)(DbPage*,in
3690: 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68  t);   /* Call th
36a0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
36b0: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
36c0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
36d0: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
36e0: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
36f0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
3700: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
3710: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
3720: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
3730: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
3740: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
3750: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
3760: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  () */.#endif.  i
3770: 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20  nt nHash;       
3780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
3790: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ze of the pager 
37a0: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
37b0: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20  PgHdr **aHash;  
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
37d0: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70  ash table to map
37e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
37f0: 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20  PgHdr */.#ifdef 
3800: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
3810: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
3820: 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20    Pager *pNext; 
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3840: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
3850: 70 61 67 65 72 73 20 69 6e 20 74 68 69 73 20 74  pagers in this t
3860: 68 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a  hread */.#endif.
3870: 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63    char *pTmpSpac
3880: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3890: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
38a0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
38b0: 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20  or tmp use */.  
38c0: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
38d0: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
38e0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
38f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
3900: 61 6e 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  anges */.};../*.
3910: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
3920: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
3930: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
3940: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
3950: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
3960: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
3970: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
3980: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
3990: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
39a0: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
39b0: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
39c0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
39d0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
39e0: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
39f0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3a00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3a10: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
3a20: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3a30: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
3a40: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
3a50: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3a60: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
3a70: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3a80: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
3a90: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3aa0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3ab0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
3ac0: 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nal */.int sqlit
3ad0: 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
3ae0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3af0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65   Number of cache
3b00: 20 70 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a   pages freed */.
3b10: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
3b20: 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73  NCR(v)  v++.#els
3b30: 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  e.# define PAGER
3b40: 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a  _INCR(v).#endif.
3b50: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  .../*.** Journal
3b60: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
3b70: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
3b80: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
3b90: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
3ba0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
3bb0: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
3bc0: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
3bd0: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
3be0: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
3bf0: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
3c00: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
3c10: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
3c20: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
3c30: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
3c40: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
3c50: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
3c60: 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a  urnal is begin.*
3c70: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
3c80: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
3c90: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
3ca0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
3cb0: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
3cc0: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
3cd0: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
3ce0: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
3cf0: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
3d00: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
3d10: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
3d20: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
3d30: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
3d40: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
3d50: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
3d60: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
3d70: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
3d80: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
3d90: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
3da0: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
3db0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
3dc0: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
3dd0: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
3de0: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
3df0: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
3e00: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
3e10: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
3e20: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
3e30: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
3e40: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
3e50: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
3e60: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
3e70: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
3e80: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
3e90: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
3ea0: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
3eb0: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
3ec0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
3ed0: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
3ee0: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
3ef0: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
3f00: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
3f10: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
3f20: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
3f30: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
3f40: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
3f50: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
3f60: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
3f70: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
3f80: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
3f90: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
3fa0: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
3fb0: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
3fc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
3fd0: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
3fe0: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
3ff0: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
4000: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
4010: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
4020: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
4030: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
4040: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
4050: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
4060: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
4070: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4080: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
4090: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
40a0: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
40b0: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
40c0: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
40d0: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
40e0: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66  he header and of
40f0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
4100: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74  e journal is det
4110: 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68  ermined.** by th
4120: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
4130: 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  os..*/.#define J
4140: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
4150: 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e  ger)  ((pPager->
4160: 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a  pageSize) + 8)..
4170: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
4180: 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f  l header size fo
4190: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e  r this pager. In
41a0: 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 69   the future, thi
41b0: 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65  s could be.** se
41c0: 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20  t to some value 
41d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69  read from the di
41e0: 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54  sk controller. T
41f0: 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20  he important.** 
4200: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20 69  characteristic i
4210: 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  s that it is the
4220: 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20   same size as a 
4230: 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a  disk sector..*/.
4240: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
4250: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28  HDR_SZ(pPager) (
4260: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
4270: 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  ze)../*.** The m
4280: 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72  acro MEMDB is tr
4290: 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61  ue if we are dea
42a0: 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d  ling with an in-
42b0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
42c0: 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61  .** We do this a
42d0: 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61  s a macro so tha
42e0: 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  t if the SQLITE_
42f0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61  OMIT_MEMORYDB ma
4300: 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74  cro is set,.** t
4310: 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44  he value of MEMD
4320: 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73  B will be a cons
4330: 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d  tant and the com
4340: 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d  piler will optim
4350: 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20  ize.** out code 
4360: 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72  that would never
4370: 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66   execute..*/.#if
4380: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4390: 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e  MEMORYDB.# defin
43a0: 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a  e MEMDB 0.#else.
43b0: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70  # define MEMDB p
43c0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e  Pager->memDb.#en
43d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  dif../*.** Page 
43e0: 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f  number PAGER_MJ_
43f0: 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73  PGNO is never us
4400: 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  ed in an SQLite 
4410: 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a  database (it is.
4420: 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  ** reserved for 
4430: 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61  working around a
4440: 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69   windows/posix i
4450: 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e  ncompatibility).
4460: 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69   It is.** used i
4470: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  n the journal to
4480: 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68   signify that th
4490: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
44a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
44b0: 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74  .** is devoted t
44c0: 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74  o storing a mast
44d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
44e0: 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  - there are no m
44f0: 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20  ore pages to.** 
4500: 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63  roll back. See c
4510: 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63  omments for func
4520: 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72  tion writeMaster
4530: 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65  Journal() for de
4540: 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65  tails..*/./* #de
4550: 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47  fine PAGER_MJ_PG
4560: 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42  NO(x) (PENDING_B
4570: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
4580: 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ze)) */.#define 
4590: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
45a0: 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f   ((PENDING_BYTE/
45b0: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
45c0: 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  +1)../*.** The m
45d0: 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67  aximum legal pag
45e0: 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33  e number is (2^3
45f0: 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69  1 - 1)..*/.#defi
4600: 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  ne PAGER_MAX_PGN
4610: 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a  O 2147483647../*
4620: 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72  .** Enable refer
4630: 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b  ence count track
4640: 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67 69  ing (for debuggi
4650: 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66  ng) here:.*/.#if
4660: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
4670: 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65  .  int pager3_re
4680: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30  finfo_enable = 0
4690: 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  ;.  static void 
46a0: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67  pager_refinfo(Pg
46b0: 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61  Hdr *p){.    sta
46c0: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
46d0: 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72 33  .    if( !pager3
46e0: 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20  _refinfo_enable 
46f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
4700: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4710: 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e 54  (.       "REFCNT
4720: 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52  : %4d addr=%p nR
4730: 65 66 3d 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64  ef=%-3d total=%d
4740: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70  \n",.       p->p
4750: 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
4760: 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20  TA(p), p->nRef, 
4770: 70 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a  p->pPager->nRef.
4780: 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b      );.    cnt++
4790: 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  ;   /* Something
47a0: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
47b0: 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23  oint on */.  }.#
47c0: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
47d0: 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66  X)  pager_refinf
47e0: 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  o(X).#else.# def
47f0: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23  ine REFINFO(X).#
4800: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
4810: 75 72 6e 20 74 72 75 65 20 69 66 20 70 61 67 65  urn true if page
4820: 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65 61 64   *pPg has alread
4830: 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
4840: 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  o the statement.
4850: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73  ** journal (or s
4860: 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f  tatement snapsho
4870: 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  t has been creat
4880: 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70  ed, if *pPg is p
4890: 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d  art.** of an in-
48a0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29  memory database)
48b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48c0: 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
48d0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
48e0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
48f0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
4900: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72  ( MEMDB ){.    r
4910: 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48  eturn PGHDR_TO_H
4920: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
4930: 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73  ->inStmt;.  }els
4940: 65 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  e{.    Pgno pgno
4950: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
4960: 20 20 75 38 20 2a 61 20 3d 20 70 50 61 67 65 72    u8 *a = pPager
4970: 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20 20 20 20 72  ->aInStmt;.    r
4980: 65 74 75 72 6e 20 28 61 20 26 26 20 28 69 6e 74  eturn (a && (int
4990: 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  )pgno<=pPager->s
49a0: 74 6d 74 53 69 7a 65 20 26 26 20 28 61 5b 70 67  tmtSize && (a[pg
49b0: 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
49c0: 6f 26 37 29 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  o&7))));.  }.}..
49d0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
49e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   size of the pag
49f0: 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  er hash table to
4a00: 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61   N.  N must be a
4a10: 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f   power.** of two
4a20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4a30: 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61   pager_resize_ha
4a40: 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a  sh_table(Pager *
4a50: 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a  pPager, int N){.
4a60: 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c    PgHdr **aHash,
4a70: 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28   *pPg;.  assert(
4a80: 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29   N>0 && (N&(N-1)
4a90: 29 3d 3d 30 20 29 3b 0a 20 20 61 48 61 73 68 20  )==0 );.  aHash 
4aa0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
4ab0: 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29  sizeof(aHash[0])
4ac0: 2a 4e 20 29 3b 0a 20 20 69 66 28 20 61 48 61 73  *N );.  if( aHas
4ad0: 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46  h==0 ){.    /* F
4ae0: 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68  ailure to rehash
4af0: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
4b00: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20  .  It is only a 
4b10: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
4b20: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
4b30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
4b40: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
4b50: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  .  pPager->nHash
4b60: 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = N;.  pPager->
4b70: 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20  aHash = aHash;. 
4b80: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
4b90: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
4ba0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
4bb0: 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69      int h;.    i
4bc0: 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  f( pPg->pgno==0 
4bd0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
4be0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d   pPg->pNextHash=
4bf0: 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76  =0 && pPg->pPrev
4c00: 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
4c10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
4c20: 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67  .    h = pPg->pg
4c30: 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20  no & (N-1);.    
4c40: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
4c50: 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69   aHash[h];.    i
4c60: 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20  f( aHash[h] ){. 
4c70: 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70       aHash[h]->p
4c80: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
4c90: 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b      }.    aHash[
4ca0: 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50  h] = pPg;.    pP
4cb0: 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
4cc0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
4cd0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
4ce0: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
4cf0: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
4d00: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
4d10: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
4d20: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
4d30: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4d40: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
4d50: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
4d60: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
4d70: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
4d80: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
4d90: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
4da0: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
4db0: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
4dc0: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
4dd0: 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75  ts(OsFile *fd, u
4de0: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
4df0: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
4e00: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
4e10: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
4e20: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a  c, sizeof(ac));.
4e30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4e40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
4e50: 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c   = (ac[0]<<24) |
4e60: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
4e70: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
4e80: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
4e90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
4ea0: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
4eb0: 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ger into a strin
4ec0: 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d  g buffer in big-
4ed0: 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65  endian byte orde
4ee0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4ef0: 64 20 70 75 74 33 32 62 69 74 73 28 63 68 61 72  d put32bits(char
4f00: 20 2a 61 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a   *ac, u32 val){.
4f10: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
4f20: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  24) & 0xff;.  ac
4f30: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
4f40: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20  & 0xff;.  ac[2] 
4f50: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
4f60: 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c  f;.  ac[3] = val
4f70: 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
4f80: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
4f90: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
4fa0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4fb0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
4fc0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
4fd0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
4fe0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4ff0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
5000: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
5010: 20 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46   write32bits(OsF
5020: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c  ile *fd, u32 val
5030: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
5040: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
5050: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
5060: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
5070: 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a  d, ac, 4);.}../*
5080: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
5090: 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  t integer at off
50a0: 73 65 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f  set 'offset' fro
50b0: 6d 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74  m the page ident
50c0: 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65  ified by.** page
50d0: 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a   header 'p'..*/.
50e0: 73 74 61 74 69 63 20 75 33 32 20 72 65 74 72 69  static u32 retri
50f0: 65 76 65 33 32 62 69 74 73 28 50 67 48 64 72 20  eve32bits(PgHdr 
5100: 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b  *p, int offset){
5110: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5120: 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28   *ac;.  ac = &((
5130: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50  unsigned char*)P
5140: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29  GHDR_TO_DATA(p))
5150: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75  [offset];.  retu
5160: 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c  rn (ac[0]<<24) |
5170: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
5180: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
5190: 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ];.}.../*.** Thi
51a0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
51b0: 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  d be called when
51c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
51d0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
51e0: 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66  r.** code. The f
51f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
5200: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
5210: 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
5220: 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  e, the.** second
5230: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
5240: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
5250: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
5260: 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  API function. .*
5270: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
5280: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
5290: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
52a0: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
52b0: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
52c0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
52d0: 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
52e0: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
52f0: 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45  RRUPT, or SQLITE
5300: 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72  _FULL.** the err
5310: 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69  or becomes persi
5320: 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73 65  stent. All subse
5330: 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20  quent API calls 
5340: 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a 2a 2a  on this Pager.**
5350: 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   will immediatel
5360: 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  y return the sam
5370: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
5380: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
5390: 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70  r_error(Pager *p
53a0: 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a  Pager, int rc){.
53b0: 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26    int rc2 = rc &
53c0: 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28   0xff;.  assert(
53d0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
53e0: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
53f0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
5400: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
5410: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
5420: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
5430: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
5440: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
5450: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
5460: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
5470: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d  rrCode = rc;.  }
5480: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5490: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
54a0: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
54b0: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
54c0: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
54d0: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
54e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
54f0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
5500: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5510: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
5520: 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65  int i;.  unsigne
5530: 64 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20  d char *pData = 
5540: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
5550: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
5560: 50 61 67 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Page);.  for(i=0
5570: 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50 61 67 65  ; i<pPage->pPage
5580: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b  r->pageSize; i++
5590: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
55a0: 61 73 68 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b  ash+i)^pData[i];
55b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
55c0: 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  sh;.}../*.** The
55d0: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
55e0: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
55f0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
5600: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
5610: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
5620: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
5630: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
5640: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
5650: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
5660: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
5670: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
5680: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
5690: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
56a0: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
56b0: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
56c0: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
56d0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
56e0: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
56f0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
5700: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
5710: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67  ;.  assert( !pPg
5720: 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50  ->pageHash || pP
5730: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
5740: 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64   MEMDB || pPg->d
5750: 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70  irty || .      p
5760: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
5770: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
5780: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
5790: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
57a0: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
57b0: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
57c0: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
57d0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
57e0: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
57f0: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73  open..** The mas
5800: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5810: 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72   name is read fr
5820: 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  om the end of th
5830: 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77  e file and .** w
5840: 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f  ritten into memo
5850: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
5860: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
5870: 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a   *pzMaster is.**
5880: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74   set to point at
5890: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20   the memory and 
58a0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
58b0: 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
58c0: 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65  ust.** sqliteFre
58d0: 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a  e() *pzMaster..*
58e0: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
58f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
5900: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ame is present *
5910: 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20  pzMaster is set 
5920: 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  to 0 and.** SQLI
5930: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
5940: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
5950: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
5960: 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  OsFile *pJrnl, c
5970: 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b  har **pzMaster){
5980: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
5990: 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b   len;.  i64 szJ;
59a0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20  .  u32 cksum;.  
59b0: 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65  int i;.  unsigne
59c0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
59d0: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
59e0: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
59f0: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a  header */..  *pz
5a00: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72  Master = 0;..  r
5a10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
5a20: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
5a30: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
5a40: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31  LITE_OK || szJ<1
5a50: 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  6 ) return rc;..
5a60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5a70: 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  Seek(pJrnl, szJ-
5a80: 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  16);.  if( rc!=S
5a90: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5aa0: 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72  n rc;. .  rc = r
5ab0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
5ac0: 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63   &len);.  if( rc
5ad0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5ae0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
5af0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
5b00: 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66  l, &cksum);.  if
5b10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5b20: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5b30: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
5b40: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
5b50: 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 8);.  if( rc!=
5b60: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d  SQLITE_OK || mem
5b70: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
5b80: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20  rnalMagic, 8) ) 
5b90: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5ba0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
5bb0: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c  (pJrnl, szJ-16-l
5bc0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5bd0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5be0: 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74  n rc;..  *pzMast
5bf0: 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  er = (char *)sql
5c00: 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29  iteMalloc(len+1)
5c10: 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74  ;.  if( !*pzMast
5c20: 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  er ){.    return
5c30: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5c40: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
5c50: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a  3OsRead(pJrnl, *
5c60: 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a  pzMaster, len);.
5c70: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5c80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
5c90: 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29  eFree(*pzMaster)
5ca0: 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20  ;.    *pzMaster 
5cb0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
5cc0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
5cd0: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
5ce0: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
5cf0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
5d00: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
5d10: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
5d20: 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61   cksum -= (*pzMa
5d30: 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20  ster)[i];.  }.  
5d40: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
5d50: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
5d60: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
5d70: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
5d80: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
5d90: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
5da0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
5db0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5dc0: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
5dd0: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
5de0: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
5df0: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
5e00: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
5e10: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
5e20: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
5e30: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
5e40: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
5e50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a      sqliteFree(*
5e60: 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a  pzMaster);.    *
5e70: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  pzMaster = 0;.  
5e80: 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d  }else{.    (*pzM
5e90: 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c  aster)[len] = '\
5ea0: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
5eb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
5ed0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
5ee0: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
5ef0: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
5f00: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
5f10: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5f20: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
5f30: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
5f40: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
5f50: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
5f60: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
5f70: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
5f80: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
5f90: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
5fa0: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
5fb0: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
5fc0: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
5ff0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
6000: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
6010: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
6020: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
6030: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
6040: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
6050: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
6060: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
6070: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
6080: 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  nt seekJournalHd
6090: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
60a0: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
60b0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
60c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
60d0: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
60e0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
60f0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
6100: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
6110: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6120: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
6130: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
6140: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6150: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
6160: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
6170: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
6180: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
6190: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
61a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
61b0: 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20  Off = offset;.  
61c0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
61d0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
61e0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
61f0: 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lOff);.}../*.** 
6200: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
6210: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
6220: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
6230: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
6240: 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28  rnal.** header (
6250: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6260: 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e  ytes) is written
6270: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
6280: 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a  l file at the.**
6290: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
62a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
62b0: 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  mat for the jour
62c0: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73  nal header is as
62d0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38   follows:.** - 8
62e0: 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64   bytes: Magic id
62f0: 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61  entifying journa
6300: 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34  l format..** - 4
6310: 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f   bytes: Number o
6320: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75  f records in jou
6330: 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73  rnal, or -1 no-s
6340: 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a  ync mode is on..
6350: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61  ** - 4 bytes: Ra
6360: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64  ndom number used
6370: 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a   for page hash..
6380: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e  ** - 4 bytes: In
6390: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70  itial database p
63a0: 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20  age count..** - 
63b0: 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20  4 bytes: Sector 
63c0: 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
63d0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
63e0: 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ote this journal
63f0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
6400: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
6410: 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73  R_SZ - 24) bytes
6420: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
6430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6440: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
6450: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
6460: 20 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73    char zHeader[s
6470: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6480: 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e 74 20  gic)+16];.  int 
6490: 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  rc;..  if( pPage
64a0: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30  r->stmtHdrOff==0
64b0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
64c0: 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61  stmtHdrOff = pPa
64d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
64e0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 65 65  .  }..  rc = see
64f0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
6500: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  er);.  if( rc ) 
6510: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
6520: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
6530: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
6540: 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
6550: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
6560: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6570: 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58  ager);..  /* FIX
6580: 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20   ME: .  **.  ** 
6590: 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70  Possibly for a p
65a0: 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  ager not in no-s
65b0: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
65c0: 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75  urnal magic shou
65d0: 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77  ld not.  ** be w
65e0: 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65  ritten until nRe
65f0: 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61  c is filled in a
6600: 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73  s part of next s
6610: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20  yncJournal(). . 
6620: 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
6630: 79 20 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c  y maybe the whol
6640: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6650: 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79   should be delay
6660: 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20  ed until that.  
6670: 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20  ** point. Think 
6680: 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f  about this..  */
6690: 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65  .  memcpy(zHeade
66a0: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
66b0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
66c0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a 20 54  lMagic));.  /* T
66d0: 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30  he nRec Field. 0
66e0: 78 46 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f  xFFFFFFFF for no
66f0: 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20  -sync journals. 
6700: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
6710: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6720: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
6730: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
6740: 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 29   0xffffffff : 0)
6750: 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ;.  /* The rando
6760: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
6770: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73  tialiser */ .  s
6780: 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
6790: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
67a0: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
67b0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
67c0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
67d0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
67e0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
67f0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6800: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
6810: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
6820: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
6830: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6840: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6850: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  +8], pPager->dbS
6860: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
6870: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
6880: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
6890: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
68a0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
68b0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
68c0: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
68d0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 49 4f  ectorSize);.  IO
68e0: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
68f0: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
6900: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
6910: 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  nalHdr, sizeof(z
6920: 48 65 61 64 65 72 29 29 29 0a 20 20 72 63 20 3d  Header))).  rc =
6930: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
6940: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
6950: 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
6960: 61 64 65 72 29 29 3b 0a 0a 20 20 2f 2a 20 54 68  ader));..  /* Th
6970: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6980: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
6990: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  n successfully. 
69a0: 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Seek the journal
69b0: 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  .  ** file descr
69c0: 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  iptor to the end
69d0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
69e0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20  header sector.. 
69f0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
6a00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49  LITE_OK ){.    I
6a10: 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c 20 25  OTRACE(("JTAIL %
6a20: 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
6a30: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
6a40: 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20 72 63  alOff-1)).    rc
6a50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
6a60: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
6a70: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6a80: 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  -1);.    if( rc=
6a90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6aa0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6ab0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
6ac0: 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b  jfd, "\000", 1);
6ad0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6ae0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6af0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
6b00: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
6b10: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
6b20: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
6b30: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
6b40: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
6b50: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
6b60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
6b70: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
6b80: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65  rnal.** file. Se
6b90: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
6ba0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
6bb0: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20  ournalHdr() for 
6bc0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
6bd0: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
6be0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
6bf0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
6c00: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
6c10: 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69  ssfully, *nRec i
6c20: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
6c30: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
6c40: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
6c50: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
6c60: 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20   *dbSize is set 
6c70: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
6c80: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
6c90: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
6ca0: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
6cb0: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
6cc0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
6cd0: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
6ce0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
6cf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
6d00: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
6d10: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
6d20: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
6d30: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
6d40: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
6d50: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
6d60: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
6d70: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
6d80: 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64  and *nRec and *d
6d90: 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65  bSize are not se
6da0: 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  t.  If JOURNAL_H
6db0: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
6dc0: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
6dd0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
6de0: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
6df0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
6e00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
6e10: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
6e20: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
6e30: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
6e40: 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  ,.  u32 *pNRec, 
6e50: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a  .  u32 *pDbSize.
6e60: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
6e70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
6e80: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
6e90: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
6ea0: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
6eb0: 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72  .  rc = seekJour
6ec0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
6ed0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6ee0: 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  n rc;..  if( pPa
6ef0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
6f00: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6f10: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
6f20: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
6f30: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
6f40: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
6f50: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
6f60: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
6f70: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a  izeof(aMagic));.
6f80: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6f90: 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d  n rc;..  if( mem
6fa0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
6fb0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
6fc0: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
6fd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6fe0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
6ff0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
7000: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52  pPager->jfd, pNR
7010: 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ec);.  if( rc ) 
7020: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
7030: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
7040: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
7050: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7060: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
7070: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
7080: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
7090: 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a  >jfd, pDbSize);.
70a0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
70b0: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  n rc;..  /* Upda
70c0: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
70d0: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
70e0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
70f0: 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20  ed by .  ** the 
7100: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
7110: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
7120: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
7130: 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61  al was.  ** crea
7140: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
7150: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
7160: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
7170: 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20  routine.  ** is 
7180: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
7190: 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
71a0: 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
71b0: 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ocal value.  ** 
71c0: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
71d0: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
71e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
71f0: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  at routine..  */
7200: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
7210: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
7220: 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e  (u32 *)&pPager->
7230: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
7240: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
7250: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
7260: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
7270: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7280: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
7290: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
72a0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
72b0: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74  urnalOff);.  ret
72c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
72d0: 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
72e0: 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
72f0: 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
7300: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
7310: 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
7320: 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
7330: 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
7340: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
7350: 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
7360: 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
7370: 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
7380: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
7390: 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
73a0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
73b0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
73c0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
73d0: 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
73e0: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
73f0: 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
7400: 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
7410: 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
7420: 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  .**.** + 4 bytes
7430: 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
7440: 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c  .** + N bytes: l
7450: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
7460: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a  journal name..**
7470: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a   + 4 bytes: N.**
7480: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
7490: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
74a0: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38  checksum..** + 8
74b0: 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c   bytes: aJournal
74c0: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54  Magic[]..**.** T
74d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
74e0: 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  l page checksum 
74f0: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
7500: 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  e bytes in the m
7510: 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
7520: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
7530: 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
7540: 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
7550: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
7560: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
7570: 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
7580: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
7590: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
75a0: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
75b0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
75c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
75d0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
75e0: 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e    int len; .  in
75f0: 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75  t i; .  u32 cksu
7600: 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  m = 0;.  char zB
7610: 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  uf[sizeof(aJourn
7620: 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a  alMagic)+2*4];..
7630: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
7640: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
7650: 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ter) return SQLI
7660: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d  TE_OK;.  pPager-
7670: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
7680: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
7690: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28  zMaster);.  for(
76a0: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
76b0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
76c0: 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a  Master[i];.  }..
76d0: 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
76e0: 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
76f0: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
7700: 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
7710: 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
7720: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7730: 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
7740: 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
7750: 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
7760: 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
7770: 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
7780: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
7790: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
77a0: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
77b0: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
77c0: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
77d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
77e0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
77f0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
7800: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c  journalOff += (l
7810: 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20  en+20);..  rc = 
7820: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
7830: 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d  er->jfd, PAGER_M
7840: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b  J_PGNO(pPager));
7850: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7860: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
7870: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
7880: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
7890: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  >jfd, zMaster, l
78a0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
78b0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
78c0: 6e 20 72 63 3b 0a 0a 20 20 70 75 74 33 32 62 69  n rc;..  put32bi
78d0: 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20  ts(zBuf, len);. 
78e0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66   put32bits(&zBuf
78f0: 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d  [4], cksum);.  m
7900: 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20  emcpy(&zBuf[8], 
7910: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
7920: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7930: 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  gic));.  rc = sq
7940: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
7950: 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20  ger->jfd, zBuf, 
7960: 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  8+sizeof(aJourna
7970: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67  lMagic));.  pPag
7980: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  er->needSync = !
7990: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
79a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
79b0: 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d  /*.** Add or rem
79c0: 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ove a page from 
79d0: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
79e0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69  pages that are i
79f0: 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65  n the.** stateme
7a00: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
7a10: 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70  * The Pager keep
7a20: 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73  s a separate lis
7a30: 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  t of pages that 
7a40: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
7a50: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e  .** the statemen
7a60: 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73  t journal.  This
7a70: 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74   helps the sqlit
7a80: 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
7a90: 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72  t().** routine r
7aa0: 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66  un MUCH faster f
7ab0: 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
7ac0: 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61  se where there a
7ad0: 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73  re many.** pages
7ae0: 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f   in memory but o
7af0: 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e  nly a few are in
7b00: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
7b10: 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ournal..*/.stati
7b20: 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f  c void page_add_
7b30: 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  to_stmt_list(PgH
7b40: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
7b50: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
7b60: 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73  >pPager;.  PgHis
7b70: 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
7b80: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
7b90: 20 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65   pPager);.  asse
7ba0: 72 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69  rt( MEMDB );.  i
7bb0: 66 28 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d  f( !pHist->inStm
7bc0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
7bd0: 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
7be0: 74 3d 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70  t==0 && pHist->p
7bf0: 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  NextStmt==0 );. 
7c00: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
7c10: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47  Stmt ){.      PG
7c20: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67  HDR_TO_HIST(pPag
7c30: 65 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  er->pStmt, pPage
7c40: 72 29 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  r)->pPrevStmt = 
7c50: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pPg;.    }.    p
7c60: 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
7c70: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
7c80: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
7c90: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48  mt = pPg;.    pH
7ca0: 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  ist->inStmt = 1;
7cb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  .  }.}../*.** Fi
7cc0: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
7cd0: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
7ce0: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
7cf0: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
7d00: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
7d10: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
7d20: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
7d30: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
7d40: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
7d50: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
7d60: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
7d70: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
7d80: 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  sh==0 ) return 0
7d90: 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  ;.  p = pPager->
7da0: 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50  aHash[pgno & (pP
7db0: 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b  ager->nHash-1)];
7dc0: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
7dd0: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
7de0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
7df0: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
7e00: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
7e10: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
7e20: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  se file..*/.stat
7e30: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
7e40: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
7e50: 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
7e60: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
7e70: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45  e ){.    if( !ME
7e80: 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MDB ){.      sql
7e90: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
7ea0: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
7eb0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
7ec0: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
7ed0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
7ee0: 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOCK %p\n", pPag
7ef0: 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 20 20 70  er)).    }.    p
7f00: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
7f10: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
7f20: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
7f30: 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
7f40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  }.}../*.** Execu
7f50: 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
7f60: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
7f70: 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
7f80: 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
7f90: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
7fa0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
7fb0: 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
7fc0: 61 64 79 20 65 6e 74 65 72 65 64 0a 2a 2a 20 74  ady entered.** t
7fd0: 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 2e 0a  he error-state..
7fe0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
7ff0: 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
8000: 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b  lback(Pager *p){
8010: 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64  .  if( p->errCod
8020: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  e ) return;.  as
8030: 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d  sert( p->state>=
8040: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
8050: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  | p->journalOpen
8060: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
8070: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
8080: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  ERVED ){.    sql
8090: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
80a0: 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  k(p);.  }.  page
80b0: 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20 61  r_unlock(p);.  a
80c0: 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64  ssert( p->errCod
80d0: 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61 6c  e || !p->journal
80e0: 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63 6c  Open || (p->excl
80f0: 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e 6a  usiveMode&&!p->j
8100: 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20 20  ournalOff) );.  
8110: 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f  assert( p->errCo
8120: 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f 70  de || !p->stmtOp
8130: 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73 69  en || p->exclusi
8140: 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a 2f 2a  veMode );.}.../*
8150: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69 6e  .** Clear the in
8160: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
8170: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
8180: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
8190: 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  f the pager back
81a0: 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20   to what it was 
81b0: 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73  when it was firs
81c0: 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e  t.** opened.  An
81d0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
81e0: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
81f0: 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ted and subseque
8200: 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  nt attempts.** t
8210: 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70  o access those p
8220: 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ages will likely
8230: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
8240: 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  edump..*/.static
8250: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
8260: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
8270: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20  {.  PgHdr *pPg, 
8280: 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50  *pNext;.  if( pP
8290: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
82a0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50  return;.  for(pP
82b0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
82c0: 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
82d0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50  .    IOTRACE(("P
82e0: 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20  GFREE %p %d\n", 
82f0: 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
8300: 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  o));.    PAGER_I
8310: 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
8320: 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b  r_pgfree_count);
8330: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
8340: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
8350: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
8360: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
8370: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Stmt = 0;.  pPag
8380: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a  er->pFirst = 0;.
8390: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
83a0: 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50  Synced = 0;.  pP
83b0: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
83c0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  .  pPager->pAll 
83d0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
83e0: 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Hash = 0;.  sqli
83f0: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
8400: 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d  Hash);.  pPager-
8410: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  >nPage = 0;.  pP
8420: 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b  ager->aHash = 0;
8430: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
8440: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
8450: 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20  is routine ends 
8460: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
8470: 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  A transaction is
8480: 20 65 6e 64 65 64 20 62 79 20 65 69 74 68 65 72   ended by either
8490: 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20  .** a COMMIT or 
84a0: 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a  a ROLLBACK..**.*
84b0: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
84c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
84d0: 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
84e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
84f0: 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45  en and.** a RESE
8500: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
8510: 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
8520: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
8530: 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61  utine will relea
8540: 73 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  se.** the databa
8550: 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75  se lock and acqu
8560: 69 72 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f  ires a SHARED lo
8570: 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20  ck in its place 
8580: 69 66 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68  if that is.** th
8590: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 68  e appropriate th
85a0: 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65  ing to do.  Rele
85b0: 61 73 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c  ase locks usuall
85c0: 79 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  y is appropriate
85d0: 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61  ,.** unless we a
85e0: 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  re in exclusive 
85f0: 61 63 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75  access mode or u
8600: 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61 20  nless this is a 
8610: 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42  .** COMMIT AND B
8620: 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  EGIN or ROLLBACK
8630: 20 41 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61   AND BEGIN opera
8640: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
8650: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
8660: 65 69 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f  either deleted o
8670: 72 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a  r truncated..**.
8680: 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65  ** TODO: Conside
8690: 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f  r keeping the jo
86a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
86b0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  for temporary da
86c0: 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73  tabases..** This
86d0: 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65   might give a pe
86e0: 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76  rformance improv
86f0: 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73  ement on windows
8700: 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a   where opening.*
8710: 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65  * a file is an e
8720: 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
8730: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
8740: 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  t pager_end_tran
8750: 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
8760: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
8770: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
8780: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
8790: 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
87a0: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  K;.  assert( !ME
87b0: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
87c0: 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
87d0: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
87e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
87f0: 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  K;.  }.  sqlite3
8800: 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
8810: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
8820: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
8830: 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  && !pPager->excl
8840: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
8850: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
8860: 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
8870: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
8880: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Open = 0;.  }.  
8890: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
88a0: 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69  nalOpen ){.    i
88b0: 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
88c0: 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 20  siveMode .      
88d0: 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c      && (rc = sql
88e0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
88f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 29 3d  Pager->jfd, 0))=
8900: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b 0a 20  =SQLITE_OK ){;. 
8910: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
8920: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
8930: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  0);.      pPager
8940: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
8950: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
8960: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
8970: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
8980: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
8990: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ose(&pPager->jfd
89a0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
89b0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
89c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
89d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
89e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
89f0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
8a00: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
8a10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
8a20: 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65  qliteFree( pPage
8a30: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->aInJournal );
8a40: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
8a50: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
8a60: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
8a70: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
8a80: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
8a90: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
8aa0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
8ab0: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
8ac0: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
8ad0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ync = 0;.      p
8ae0: 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
8af0: 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ck = 0;.#ifdef S
8b00: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
8b10: 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
8b20: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
8b30: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
8b40: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  dif.    }.    pP
8b50: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
8b60: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
8b70: 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
8b80: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
8b90: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
8ba0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8bb0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
8bc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
8bd0: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
8be0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75  ==0 || pPager->u
8bf0: 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  seJournal==0 );.
8c00: 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
8c10: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
8c20: 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 73  e ){.    rc2 = s
8c30: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
8c40: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
8c50: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
8c60: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
8c70: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c  ER_SHARED;.  }el
8c80: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
8c90: 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
8ca0: 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ED ){.    pPager
8cb0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
8cc0: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20  EXCLUSIVE;.  }. 
8cd0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
8ce0: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
8cf0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
8d00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
8d10: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
8d20: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
8d30: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
8d40: 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  t;.  pPager->dbS
8d50: 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72 65 74  ize = -1;..  ret
8d60: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
8d70: 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
8d80: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
8d90: 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
8da0: 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  um for the page 
8db0: 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  of data..**.** T
8dc0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
8dd0: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20  l checksum.  It 
8de0: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
8df0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
8e00: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
8e10: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
8e20: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20  age number.  We 
8e30: 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74  experimented wit
8e40: 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20  h.** a checksum 
8e50: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61  of the entire da
8e60: 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73  ta, but that was
8e70: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f   found to be too
8e80: 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   slow..**.** Not
8e90: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
8ea0: 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64  number is stored
8eb0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
8ec0: 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a  g of data and.**
8ed0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73   the checksum is
8ee0: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65   stored at the e
8ef0: 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70  nd.  This is imp
8f00: 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72  ortant.  If jour
8f10: 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  nal.** corruptio
8f20: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
8f30: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
8f40: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
8f50: 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20   scenario.** is 
8f60: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
8f70: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
8f80: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
8f90: 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a  changed.  It is.
8fa0: 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  ** much less lik
8fb0: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
8fc0: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
8fd0: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
8fe0: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
8ff0: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
9000: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
9010: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
9020: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
9030: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
9040: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
9050: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
9060: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
9070: 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20  ..**.** FIX ME: 
9080: 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   Consider adding
9090: 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72   every 200th (or
90a0: 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65   so) byte of the
90b0: 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20   data to the.** 
90c0: 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20  checksum.  That 
90d0: 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20  way if a single 
90e0: 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20  page spans 3 or 
90f0: 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72  more disk sector
9100: 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68  s and.** only th
9110: 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20  e middle sector 
9120: 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77  is corrupt, we w
9130: 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61  ill still have a
9140: 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63   reasonable.** c
9150: 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67  hance of failing
9160: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e   the checksum an
9170: 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67  d thus detecting
9180: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f   the problem..*/
9190: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
91a0: 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
91b0: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  Pager, const u8 
91c0: 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
91d0: 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
91e0: 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20  ksumInit;.  int 
91f0: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
9200: 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c  Size-200;.  whil
9210: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
9220: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
9230: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
9240: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
9250: 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  m;.}../* Forward
9260: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
9270: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
9280: 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a  Clean(PgHdr*);..
9290: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
92a0: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
92b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
92c0: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
92d0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
92e0: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
92f0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
9300: 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69  If useCksum==0 i
9310: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75  t means this jou
9320: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73  rnal does not us
9330: 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68  e checksums.  Ch
9340: 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e  ecksums.** are n
9350: 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65  ot used in state
9360: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65  ment journals be
9370: 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20  cause statement 
9380: 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a  journals do not.
9390: 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69  ** need to survi
93a0: 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ve power failure
93b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
93c0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
93d0: 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a  one_page(Pager *
93e0: 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a  pPager, OsFile *
93f0: 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75  jfd, int useCksu
9400: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
9410: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9430: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
9440: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
9450: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9470: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
9480: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
9490: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
94a0: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94c0: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
94d0: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
94e0: 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61  g */.  u8 *aData
94f0: 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d   = (u8 *)pPager-
9500: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a  >pTmpSpace;   /*
9510: 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f   Temp storage fo
9520: 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f  r a page */..  /
9530: 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c  * useCksum shoul
9540: 64 20 62 65 20 74 72 75 65 20 66 6f 72 20 74 68  d be true for th
9550: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
9560: 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a  nd false for.  *
9570: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  * statement jour
9580: 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68  nals.  Verify th
9590: 61 74 20 74 68 69 73 20 69 73 20 61 6c 77 61 79  at this is alway
95a0: 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a  s the case.  */.
95b0: 20 20 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d    assert( jfd ==
95c0: 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61   (useCksum ? pPa
95d0: 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
95e0: 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73  r->stfd) );.  as
95f0: 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a  sert( aData );..
9600: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
9610: 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20  s(jfd, &pgno);. 
9620: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9630: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
9640: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9650: 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c  Read(jfd, aData,
9660: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9670: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
9680: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
9690: 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   rc;.  pPager->j
96a0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
96b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
96c0: 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
96d0: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
96e0: 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
96f0: 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
9700: 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
9710: 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
9720: 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
9730: 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
9740: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
9750: 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
9760: 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
9770: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
9780: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
9790: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
97a0: 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
97b0: 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
97c0: 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
97d0: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
97e0: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
97f0: 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
9800: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
9810: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
9820: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9830: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
9840: 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69    if( pgno>(unsi
9850: 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53  gned)pPager->dbS
9860: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
9870: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
9880: 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20  .  if( useCksum 
9890: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
98a0: 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73  32bits(jfd, &cks
98b0: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
98c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
98d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
98e0: 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66  Off += 4;.    if
98f0: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
9900: 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b  ager, aData)!=ck
9910: 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
9920: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
9930: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
9940: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
9950: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
9960: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
9970: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
9980: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
9990: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
99a0: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
99b0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
99c0: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
99d0: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
99e0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
99f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
9a00: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
9a10: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
9a20: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
9a30: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
9a40: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
9a50: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
9a60: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
9a70: 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74   in EXCLUSIVE st
9a80: 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
9a90: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
9aa0: 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
9ab0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61  .  ** and the ma
9ac0: 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
9ad0: 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
9ae0: 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a   not dirty..  **
9af0: 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
9b00: 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
9b10: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
9b20: 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
9b30: 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
9b40: 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
9b50: 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
9b60: 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
9b70: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
9b80: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
9b90: 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
9ba0: 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
9bb0: 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
9bc0: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
9bd0: 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
9be0: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
9bf0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
9c00: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
9c10: 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
9c20: 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
9c30: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
9c40: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
9c50: 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
9c60: 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
9c70: 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
9c80: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
9c90: 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  in the main roll
9ca0: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
9cb0: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 69  l.  Otherwise, i
9cc0: 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43  f a full ROLLBAC
9cd0: 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 74  K occurs after t
9ce0: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  he statement.  *
9cf0: 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66  * rollback the f
9d00: 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c  ull ROLLBACK wil
9d10: 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20 74 68  l not restore th
9d20: 65 20 70 61 67 65 20 74 6f 20 69 74 73 20 6f 72  e page to its or
9d30: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74  iginal.  ** cont
9d40: 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  ent.  Two condit
9d50: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74  ions must be met
9d60: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
9d70: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
9d80: 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29 20    ** files. (1) 
9d90: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
9da0: 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32  t be locked.  (2
9db0: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
9dc0: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
9dd0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
9de0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
9df0: 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
9e00: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
9e10: 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68  not in.  ** cach
9e20: 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73 20  e or else it is 
9e30: 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
9e40: 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50  nc==0..  */.  pP
9e50: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
9e60: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
9e70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9e80: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
9e90: 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 21  XCLUSIVE || pPg!
9ea0: 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41  =0 );.  PAGERTRA
9eb0: 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE3("PLAYBACK %d
9ec0: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
9ed0: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
9ee0: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  no);.  if( pPage
9ef0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
9f00: 45 58 43 4c 55 53 49 56 45 20 26 26 20 28 70 50  EXCLUSIVE && (pP
9f10: 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65  g==0 || pPg->nee
9f20: 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20  dSync==0) ){.   
9f30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
9f40: 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
9f50: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
9f60: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
9f70: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
9f80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9f90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
9fa0: 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
9fb0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
9fc0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
9fd0: 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20      if( pPg ){. 
9fe0: 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
9ff0: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Pg);.    }.  }. 
a000: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
a010: 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
a020: 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
a030: 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
a040: 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
a050: 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
a060: 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
a070: 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
a080: 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
a090: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
a0a0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
a0b0: 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
a0c0: 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
a0d0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
a0e0: 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
a0f0: 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
a100: 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
a110: 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
a120: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
a130: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
a140: 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
a150: 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
a160: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
a170: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70  Pg->nRef==0 || p
a180: 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a  Pg->pgno==1 ); *
a190: 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47  /.    pData = PG
a1a0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a1b0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
a1c0: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
a1d0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a1e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
a1f0: 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
a200: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
a210: 65 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e  er(pPg, pPager->
a220: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
a230: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
a240: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
a250: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
a260: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
a270: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
a280: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
a290: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
a2a0: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
a2b0: 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
a2c0: 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
a2d0: 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
a2e0: 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
a2f0: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
a300: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
a310: 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
a320: 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
a330: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
a340: 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
a350: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
a360: 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
a370: 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
a380: 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
a390: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
a3a0: 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20  >pgno, 3);.  }. 
a3b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a3c0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
a3d0: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
a3e0: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
a3f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
a400: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
a410: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
a420: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
a430: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
a440: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
a450: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
a460: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
a470: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
a480: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
a490: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a4a0: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
a4b0: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
a4c0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
a4d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
a4e0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
a4f0: 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75  of all child jou
a500: 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c  rnals..** To tel
a510: 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  l if a master jo
a520: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
a530: 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65  eted, check to e
a540: 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ach of the.** ch
a550: 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20  ildren.  If all 
a560: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74  children are eit
a570: 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64  her missing or d
a580: 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a  o not refer to.*
a590: 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61  * a different ma
a5a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  ster journal, th
a5b0: 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a  en this master j
a5c0: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
a5d0: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
a5e0: 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
a5f0: 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ster(const char 
a600: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
a610: 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65   rc;.  int maste
a620: 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73  r_open = 0;.  Os
a630: 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30  File *master = 0
a640: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
a650: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
a660: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
a670: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a680: 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
a690: 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
a6a0: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
a6b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
a6c0: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
a6d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a6e0: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
a6f0: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
a700: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
a710: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
a720: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
a730: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
a740: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
a750: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ence..  */.  rc 
a760: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
a770: 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c  eadOnly(zMaster,
a780: 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 61 73 73   &master);.  ass
a790: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
a7a0: 4f 4b 20 7c 7c 20 6d 61 73 74 65 72 20 29 3b 0a  OK || master );.
a7b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a7c0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
a7d0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74  ster_out;.  mast
a7e0: 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72  er_open = 1;.  r
a7f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
a800: 65 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e  eSize(master, &n
a810: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
a820: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a830: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
a840: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
a850: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
a860: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
a870: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61  Journal;.    cha
a880: 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  r *zMasterPtr = 
a890: 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  0;..    /* Load 
a8a0: 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
a8b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
a8c0: 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
a8d0: 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  ed from.    ** s
a8e0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
a8f0: 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
a900: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
a910: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
a920: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
a930: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
a940: 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  c(nMasterJournal
a950: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
a960: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
a970: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a980: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
a990: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
a9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
a9b0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61  sqlite3OsRead(ma
a9c0: 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
a9d0: 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75  rnal, nMasterJou
a9e0: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  rnal);.    if( r
a9f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
aa00: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
aa10: 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  t;..    zJournal
aa20: 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
aa30: 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
aa40: 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
aa50: 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
aa60: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
aa70: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
aa80: 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c  eExists(zJournal
aa90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
aaa0: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
aab0: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
aac0: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
aad0: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
aae0: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
aaf0: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
ab00: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
ab10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
ab20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
ab30: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
ab40: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
ab50: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
ab60: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ab70: 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72      OsFile *jour
ab80: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nal = 0;.       
ab90: 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20   int c;..       
aba0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
abb0: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75  penReadOnly(zJou
abc0: 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b  rnal, &journal);
abd0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
abe0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
abf0: 7c 20 6a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  | journal );.   
ac00: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
ac10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ac20: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
ac30: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
ac40: 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  }..        rc = 
ac50: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
ac60: 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73  l(journal, &zMas
ac70: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
ac80: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
ac90: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
aca0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
acb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
acc0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
acd0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
ace0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  .        c = zMa
acf0: 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73 74  sterPtr!=0 && st
ad00: 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
ad10: 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
ad20: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
ad30: 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20  (zMasterPtr);.  
ad40: 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
ad50: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
ad60: 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
ad70: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
ad80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ad90: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
ada0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
adb0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
adc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
add0: 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e  urnal += (strlen
ade0: 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
adf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63     }.  }.  .  rc
ae00: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
ae10: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65  te(zMaster);..de
ae20: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
ae30: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
ae40: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  l ){.    sqliteF
ae50: 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
ae60: 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
ae70: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a   master_open ){.
ae80: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
ae90: 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d  se(&master);.  }
aea0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
aeb0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  ..static void pa
aec0: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
aed0: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
aee0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  );../*.** Trunca
aef0: 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  te the main file
af00: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61   of the given pa
af10: 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ger to the numbe
af20: 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e  r of pages.** in
af30: 64 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72  dicated. Also tr
af40: 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65  uncate the cache
af50: 64 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  d representation
af60: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f   of the file..*/
af70: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
af80: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
af90: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
afa0: 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
afb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
afc0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
afd0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
afe0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
aff0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
b000: 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
b010: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
b020: 29 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69  )nPage);.  }.  i
b030: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b040: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b050: 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
b060: 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
b070: 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
b080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b090: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
b0a0: 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66  the sectorSize f
b0b0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
b0c0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  er..**.** The se
b0d0: 63 74 6f 72 20 73 69 7a 65 20 69 73 20 74 68 65  ctor size is the
b0e0: 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 73   larger of the s
b0f0: 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72  ector size repor
b100: 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
b110: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20  3OsSectorSize() 
b120: 61 6e 64 20 74 68 65 20 70 61 67 65 53 69 7a 65  and the pageSize
b130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b140: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
b150: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
b160: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
b170: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
b180: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
b190: 2d 3e 66 64 29 3b 0a 20 20 69 66 28 20 70 50 61  ->fd);.  if( pPa
b1a0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
b1b0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b1c0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b1d0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 70 50 61  sectorSize = pPa
b1e0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
b1f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
b200: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
b210: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
b220: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
b230: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
b240: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
b250: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
b260: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
b270: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
b280: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
b290: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
b2a0: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
b2b0: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
b2c0: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
b2d0: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
b2e0: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
b2f0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
b300: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
b310: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
b320: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
b330: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
b340: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
b350: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
b360: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
b370: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
b380: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
b390: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
b3a0: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
b3b0: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
b3c0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
b3d0: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
b3e0: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
b3f0: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
b400: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
b410: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
b420: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
b430: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
b440: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
b450: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
b460: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
b470: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
b480: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
b490: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
b4a0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
b4b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
b4c0: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
b4d0: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
b4e0: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
b4f0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
b500: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
b510: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
b520: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
b530: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
b540: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
b550: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
b560: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
b570: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
b580: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
b590: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
b5a0: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
b5b0: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
b5c0: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
b5d0: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
b5e0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
b5f0: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
b600: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
b610: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
b620: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
b630: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
b640: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
b650: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
b660: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
b670: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
b680: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
b690: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
b6a0: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
b6b0: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
b6c0: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
b6d0: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
b6e0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
b6f0: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
b700: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
b710: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
b720: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
b730: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
b740: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
b750: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
b760: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
b770: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
b780: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
b790: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
b7a0: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
b7b0: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
b7c0: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
b7d0: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
b7e0: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
b7f0: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
b800: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
b810: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
b820: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
b830: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
b840: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
b850: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
b860: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
b870: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
b880: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
b890: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b8a0: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
b8b0: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
b8c0: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
b8d0: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
b8e0: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
b8f0: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
b900: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
b910: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
b920: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
b930: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
b940: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
b950: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
b960: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
b970: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
b980: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
b990: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
b9a0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
b9b0: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
b9c0: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
b9d0: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
b9e0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
b9f0: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
ba00: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
ba10: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
ba20: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
ba30: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
ba40: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
ba50: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
ba60: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
ba70: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
ba80: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
ba90: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
baa0: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
bab0: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
bac0: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
bad0: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
bae0: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
baf0: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
bb00: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
bb10: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
bb20: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
bb30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
bb40: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
bb50: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
bb60: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
bb70: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
bb80: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
bb90: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
bba0: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
bbb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
bbc0: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
bbd0: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
bbe0: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
bbf0: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
bc00: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
bc10: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
bc20: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
bc30: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
bc40: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
bc50: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
bc60: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
bc70: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
bc80: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
bc90: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
bca0: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
bcb0: 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
bcc0: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bce0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
bcf0: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
bd00: 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
bd30: 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
bd40: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  al */.  int i;  
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
bd70: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
bd80: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
bd90: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
bda0: 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
bdb0: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
bdc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bdd0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
bde0: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
bdf0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
be00: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
be10: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
be20: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
be30: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
be40: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
be50: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
be60: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
be70: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
be80: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
be90: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
bea0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
beb0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
bec0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bed0: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
bee0: 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
bef0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
bf00: 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
bf10: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
bf20: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
bf30: 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
bf40: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
bf50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
bf60: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
bf70: 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
bf80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
bf90: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
bfa0: 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
bfb0: 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
bfc0: 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
bfd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
bfe0: 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
bff0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
c000: 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
c010: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
c020: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
c030: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61  Pager->jfd, &zMa
c040: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
c050: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
c060: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
c070: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
c080: 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f  ter && !sqlite3O
c090: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
c0a0: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ter)) ){.    sql
c0b0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
c0c0: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
c0d0: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
c0e0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
c0f0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
c100: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c110: 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ck;.  }.  sqlite
c120: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
c130: 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65  jfd, 0);.  pPage
c140: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
c150: 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
c160: 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
c170: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
c180: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
c190: 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
c1a0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
c1b0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
c1c0: 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
c1d0: 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
c1e0: 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
c1f0: 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
c200: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
c210: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
c220: 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
c230: 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
c240: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c250: 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
c260: 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
c270: 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
c280: 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
c290: 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
c2a0: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
c2b0: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
c2c0: 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
c2d0: 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
c2e0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
c2f0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
c300: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
c310: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
c320: 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
c330: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c340: 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
c350: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
c360: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
c370: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
c380: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
c390: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
c3a0: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
c3b0: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
c3c0: 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
c3d0: 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
c3e0: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
c3f0: 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
c400: 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
c410: 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
c420: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
c430: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
c440: 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
c450: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
c460: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
c470: 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
c480: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
c490: 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
c4a0: 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
c4b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
c4c0: 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
c4d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c4e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c4f0: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
c500: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
c510: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
c520: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c530: 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
c540: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c550: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c560: 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
c570: 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
c580: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
c590: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
c5a0: 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e  .    ** process.
c5b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
c5c0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
c5d0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 73 69  urnal file consi
c5e0: 73 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 6a 6f  sts of.    ** jo
c5f0: 75 72 6e 61 6c 6c 65 64 20 63 6f 70 69 65 73 20  urnalled copies 
c600: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  of pages that ne
c610: 65 64 20 74 6f 20 62 65 20 72 65 61 64 20 62 61  ed to be read ba
c620: 63 6b 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ck into the cach
c630: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
c640: 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
c650: 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Hot ){.      nRe
c660: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
c670: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
c680: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
c690: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
c6a0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
c6b0: 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
c6c0: 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
c6d0: 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
c6e0: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
c6f0: 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
c700: 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c  to it's original
c710: 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
c720: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
c730: 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
c740: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
c750: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
c760: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
c770: 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
c780: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c790: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c7a0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
c7b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
c7c0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
c7d0: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
c7e0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c7f0: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
c800: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
c810: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
c820: 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
c830: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
c840: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
c850: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
c860: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
c870: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c880: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c890: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c8a0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
c8b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
c8c0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
c8d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
c8e0: 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
c8f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
c900: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c910: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c920: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
c930: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c940: 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
c950: 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
c960: 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
c970: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c980: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
c990: 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
c9a0: 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
c9b0: 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20  }.  if( zMaster 
c9c0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
c9d0: 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
c9e0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
c9f0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
ca00: 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
ca10: 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
ca20: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
ca30: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
ca40: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
ca50: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ca60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
ca70: 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
ca80: 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ter(zMaster);.  
ca90: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
caa0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(zMaster);.  }
cab0: 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
cac0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
cad0: 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
cae0: 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
caf0: 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
cb00: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
cb10: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
cb20: 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
cb30: 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
cb40: 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
cb50: 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
cb60: 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
cb70: 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
cb80: 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
cb90: 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
cba0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
cbb0: 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74  layback the stat
cbc0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
cbd0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d  *.** This is sim
cbe0: 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20  ilar to playing 
cbf0: 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
cc00: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74  tion journal but
cc10: 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65   with.** a few e
cc20: 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a  xtra twists..**.
cc30: 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e  **    (1)  The n
cc40: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
cc50: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
cc60: 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ile at the start
cc70: 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74   of.**         t
cc80: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
cc90: 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72  stored in pPager
cca0: 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20  ->stmtSize, not 
ccb0: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
ccc0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
ccd0: 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tself..**.**    
cce0: 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  (2)  In addition
ccf0: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
cd00: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
cd10: 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20  ournal, also.** 
cd20: 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b          playback
cd30: 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68   all pages of th
cd40: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
cd50: 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a  urnal beginning.
cd60: 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66  **         at of
cd70: 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d  fset pPager->stm
cd80: 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  tJSize..*/.stati
cd90: 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74  c int pager_stmt
cda0: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
cdb0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
cdc0: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
cdd0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
cde0: 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c  the full journal
cdf0: 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66   */.  i64 hdrOff
ce00: 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  ;.  int nRec;   
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce20: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
ce30: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce50: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
ce60: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
ce70: 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
ce80: 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65  urnalOff;.#ifnde
ce90: 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20  f NDEBUG .  {.  
cea0: 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20    i64 os_szJ;.  
ceb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
cec0: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
ced0: 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a  >jfd, &os_szJ);.
cee0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
cef0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
cf00: 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  c;.    assert( s
cf10: 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20  zJ==os_szJ );.  
cf20: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
cf30: 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20  et hdrOff to be 
cf40: 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20  the offset just 
cf50: 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66  after the end of
cf60: 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61   the last journa
cf70: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74  l.  ** page writ
cf80: 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66  ten before the f
cf90: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
cfa0: 64 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61  der for this sta
cfb0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e  tement.  ** tran
cfc0: 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74  saction was writ
cfd0: 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20  ten, or the end 
cfe0: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e  of the file if n
cff0: 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68  o journal.  ** h
d000: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
d010: 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66  n..  */.  hdrOff
d020: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48   = pPager->stmtH
d030: 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  drOff;.  assert(
d040: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
d050: 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a  c || !hdrOff );.
d060: 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b    if( !hdrOff ){
d070: 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a  .    hdrOff = sz
d080: 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  J;.  }.  .  /* T
d090: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
d0a0: 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73  base back to its
d0b0: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
d0c0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
d0d0: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
d0e0: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  r, pPager->stmtS
d0f0: 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
d100: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
d110: 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a  AGER_SHARED );..
d120: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
d130: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
d140: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
d150: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
d160: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
d170: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
d180: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
d190: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
d1a0: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
d1b0: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
d1c0: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
d1d0: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
d1e0: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
d1f0: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
d200: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
d210: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
d220: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
d230: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
d240: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
d250: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
d260: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
d270: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
d280: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
d290: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
d2a0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
d2b0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
d2c0: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
d2d0: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
d2e0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
d2f0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
d300: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
d310: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30   pPager->stfd, 0
d320: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
d330: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d340: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d350: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
d360: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
d370: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
d380: 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20  roll some pages 
d390: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72  back from the tr
d3a0: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
d3b0: 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69  l. Pager.stmtJSi
d3c0: 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20  ze.  ** was the 
d3d0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
d3e0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  nal file when th
d3f0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  is statement was
d400: 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a   started, so.  *
d410: 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74  * everything aft
d420: 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  er that needs to
d430: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
d440: 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
d450: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
d460: 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  the memory cache
d470: 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  , or both..  **.
d480: 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    ** If it is no
d490: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67  t zero, then Pag
d4a0: 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73  er.stmtHdrOff is
d4b0: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
d4c0: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
d4d0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
d4e0: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
d4f0: 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74  n during this st
d500: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
d510: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
d520: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
d530: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
d540: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
d550: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d560: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
d570: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d580: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
d590: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  >journalOff = pP
d5a0: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b  ager->stmtJSize;
d5b0: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  .  pPager->cksum
d5c0: 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Init = pPager->s
d5d0: 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c  tmtCksum;.  whil
d5e0: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
d5f0: 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29  alOff < hdrOff )
d600: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
d610: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
d620: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
d630: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
d640: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
d650: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
d660: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d670: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
d680: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
d690: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
d6a0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
d6b0: 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52  J ){.    u32 nJR
d6c0: 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ec;         /* N
d6d0: 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
d6e0: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
d6f0: 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
d700: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
d710: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
d720: 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
d730: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d740: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d750: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
d760: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
d770: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d780: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
d790: 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
d7a0: 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
d7b0: 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
d7c0: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70  journalOff) / (p
d7d0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
d7e0: 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  8);.    }.    fo
d7f0: 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d  r(i=nJRec-1; i>=
d800: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
d810: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
d820: 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
d830: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
d840: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
d850: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
d860: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
d870: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d880: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d890: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
d8a0: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d8b0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
d8c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d8d0: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
d8e0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
d8f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
d900: 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67  E_OK) {.    pPag
d910: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
d920: 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67   szJ;.    /* pag
d930: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
d940: 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a  pPager); */.  }.
d950: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d960: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
d970: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
d980: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
d990: 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
d9a0: 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
d9b0: 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
d9c0: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
d9d0: 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
d9e0: 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31  {.  if( mxPage>1
d9f0: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
da00: 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
da10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
da20: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
da30: 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  10;.  }.}../*.**
da40: 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
da50: 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
da60: 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
da70: 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
da80: 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
da90: 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
daa0: 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
dab0: 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
dac0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
dad0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
dae0: 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
daf0: 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
db00: 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
db10: 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
db20: 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
db30: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
db40: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
db50: 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
db60: 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
db70: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
db80: 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
db90: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
dba0: 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
dbb0: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
dbc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
dbd0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
dbe0: 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
dbf0: 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
dc00: 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
dc10: 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
dc20: 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
dc30: 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
dc40: 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
dc50: 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
dc60: 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
dc70: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
dc80: 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
dc90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dca0: 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
dcb0: 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
dcc0: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
dcd0: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
dce0: 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
dcf0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
dd00: 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
dd10: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
dd20: 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
dd30: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
dd40: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
dd50: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
dd60: 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
dd70: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
dd80: 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
dd90: 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
dda0: 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
ddb0: 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
ddc0: 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
ddd0: 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
ddf0: 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
de00: 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
de10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
de20: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
de30: 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
de40: 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
de50: 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
de60: 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
de70: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
de80: 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
de90: 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
dea0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
deb0: 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
dec0: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
ded0: 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
dee0: 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
def0: 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
df00: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
df10: 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
df20: 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
df30: 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
df40: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
df50: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
df60: 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
df70: 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
df80: 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
df90: 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
dfa0: 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20  t full_fsync){. 
dfb0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
dfc0: 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
dfd0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
dfe0: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
dff0: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
e000: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
e010: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
e020: 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c  ull_fsync = full
e030: 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50  _fsync;.  if( pP
e040: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
e050: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
e060: 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 0;.}.#endif../
e070: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
e080: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
e090: 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
e0a0: 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
e0b0: 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
e0c0: 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
e0d0: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
e0e0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
e0f0: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
e100: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
e110: 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
e120: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
e130: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
e140: 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
e150: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
e160: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
e170: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69  file. .**.** Wri
e180: 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
e190: 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
e1a0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
e1b0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
e1c0: 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
e1d0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
e1e0: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fail..**.** The 
e1f0: 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
e200: 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
e210: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
e220: 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c  when it is.** cl
e230: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
e240: 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
e250: 4f 70 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65 20  Opentemp(OsFile 
e260: 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e  **pFd){.  int cn
e270: 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 8;.  int rc;
e280: 0a 20 20 63 68 61 72 20 7a 46 69 6c 65 5b 53 51  .  char zFile[SQ
e290: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
e2a0: 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ZE];..#ifdef SQL
e2b0: 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
e2c0: 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
e2d0: 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
e2e0: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
e2f0: 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
e300: 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20  endif.  do{.    
e310: 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74  cnt--;.    sqlit
e320: 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
e330: 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20  (zFile);.    rc 
e340: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  = sqlite3OsOpenE
e350: 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20  xclusive(zFile, 
e360: 70 46 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  pFd, 1);.    ass
e370: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
e380: 4f 4b 20 7c 7c 20 2a 70 46 64 20 29 3b 0a 20 20  OK || *pFd );.  
e390: 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26  }while( cnt>0 &&
e3a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
e3b0: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
e3c0: 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  EM );.  return r
e3d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
e3e0: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
e3f0: 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
e400: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
e410: 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
e420: 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
e430: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
e440: 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
e450: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
e460: 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
e470: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
e480: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
e490: 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
e4a0: 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
e4b0: 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
e4c0: 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
e4d0: 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  g sqlite3PagerUn
e4e0: 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
e4f0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
e500: 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
e510: 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
e520: 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
e530: 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
e540: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
e550: 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
e560: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
e570: 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
e580: 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
e590: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  osed..**.** If z
e5a0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
e5b0: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20  mory:" then all 
e5c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
e5d0: 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  eld in cache..**
e5e0: 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
e5f0: 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54  tten to disk.  T
e600: 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
e610: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a  to implement an.
e620: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
e630: 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
e640: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
e650: 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
e660: 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
e670: 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
e680: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
e690: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e6a0: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
e6b0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
e6c0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
e6d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
e6e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e6f0: 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
e700: 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
e710: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
e720: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
e730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
e740: 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
e750: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  his file */.){. 
e760: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
e770: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c   0;.  char *zFul
e780: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20  lPathname = 0;. 
e790: 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f   int nameLen;  /
e7a0: 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20 77 72  * Compiler is wr
e7b0: 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ong. This is alw
e7c0: 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
e7d0: 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20  before use */.  
e7e0: 4f 73 46 69 6c 65 20 2a 66 64 20 3d 20 30 3b 0a  OsFile *fd = 0;.
e7f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e800: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
e810: 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
e820: 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  0;.  int memDb =
e830: 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   0;.  int readOn
e840: 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73  ly = 0;.  int us
e850: 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
e860: 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
e870: 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e  OURNAL)==0;.  in
e880: 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
e890: 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
e8a0: 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20  _READLOCK)!=0;. 
e8b0: 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
e8c0: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
e8d0: 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ];.#ifdef SQLITE
e8e0: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
e8f0: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41  ANAGEMENT.  /* A
e900: 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74   malloc() cannot
e910: 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33   fail in sqlite3
e920: 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20  ThreadData() as 
e930: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c  one or more call
e940: 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  s to .  ** mallo
e950: 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c  c() must have al
e960: 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20  ready been made 
e970: 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62  by this thread b
e980: 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20  efore it gets.  
e990: 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ** to this point
e9a0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
e9b0: 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74   ThreadData must
e9c0: 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63   have been alloc
e9d0: 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a  ated already.  *
e9e0: 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64  * so that Thread
e9f0: 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20  Data.nAlloc can 
ea00: 62 65 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64  be set. It would
ea10: 20 62 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65   be nice to asse
ea20: 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72  rt.  ** that Thr
ea30: 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69  eadData.nAlloc i
ea40: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20  s non-zero, but 
ea50: 61 6c 61 73 20 74 68 69 73 20 62 72 65 61 6b 73  alas this breaks
ea60: 20 74 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a   test cases .  *
ea70: 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76  * written to inv
ea80: 6f 6b 65 20 74 68 65 20 70 61 67 65 72 20 64 69  oke the pager di
ea90: 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54  rectly..  */.  T
eaa0: 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20  hreadData *pTsd 
eab0: 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
eac0: 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28  ata();.  assert(
ead0: 20 70 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a   pTsd );.#endif.
eae0: 0a 20 20 2f 2a 20 57 65 20 75 73 65 64 20 74 6f  .  /* We used to
eaf0: 20 74 65 73 74 20 69 66 20 6d 61 6c 6c 6f 63 28   test if malloc(
eb00: 29 20 68 61 64 20 61 6c 72 65 61 64 79 20 66 61  ) had already fa
eb10: 69 6c 65 64 20 62 65 66 6f 72 65 20 70 72 6f 63  iled before proc
eb20: 65 65 64 69 6e 67 2e 20 0a 20 20 2a 2a 20 42 75  eeding. .  ** Bu
eb30: 74 20 74 68 65 20 77 61 79 20 74 68 69 73 20 66  t the way this f
eb40: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
eb50: 69 6e 20 53 51 4c 69 74 65 20 6d 65 61 6e 73 20  in SQLite means 
eb60: 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72 0a 20  that can never. 
eb70: 20 2a 2a 20 68 61 70 70 65 6e 2e 20 46 75 72 74   ** happen. Furt
eb80: 68 65 72 6d 6f 72 65 2c 20 69 66 20 74 68 65 20  hermore, if the 
eb90: 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c  malloc-failed fl
eba0: 61 67 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  ag is already se
ebb0: 74 2c 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  t, .  ** either 
ebc0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
ebd0: 74 65 53 74 72 44 75 70 28 29 20 6f 72 20 73 71  teStrDup() or sq
ebe0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 62 65 6c  liteMalloc() bel
ebf0: 6f 77 20 77 69 6c 6c 0a 20 20 2a 2a 20 66 61 69  ow will.  ** fai
ec00: 6c 20 73 68 6f 72 74 6c 79 20 61 6e 64 20 53 51  l shortly and SQ
ec10: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 72 65 74 75 72  LITE_NOMEM retur
ec20: 6e 65 64 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f  ned anyway..  */
ec30: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
ec40: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
ec50: 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73  pager file and s
ec60: 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  et zFullPathname
ec70: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c   to point at mal
ec80: 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65  loc()ed .  ** me
ec90: 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mory containing 
eca0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c  the complete fil
ecb0: 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c  ename (i.e. incl
ecc0: 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63 74  uding the direct
ecd0: 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ory)..  */.  if(
ece0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
ecf0: 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69  ilename[0] ){.#i
ed00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ed10: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
ed20: 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
ed30: 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
ed40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
ed50: 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75  b = 1;.      zFu
ed60: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
ed70: 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20  iteStrDup("");. 
ed80: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
ed90: 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c      {.      zFul
eda0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
edb0: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
edc0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
edd0: 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74      if( zFullPat
ede0: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
edf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
ee00: 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75  penReadWrite(zFu
ee10: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c  llPathname, &fd,
ee20: 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20   &readOnly);.   
ee30: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
ee40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66 64  =SQLITE_OK || fd
ee50: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
ee60: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
ee70: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
ee80: 4f 70 65 6e 74 65 6d 70 28 26 66 64 29 3b 0a 20  Opentemp(&fd);. 
ee90: 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70     sqlite3OsTemp
eea0: 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29 3b  FileName(zTemp);
eeb0: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
eec0: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c   zTemp;.    zFul
eed0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
eee0: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
eef0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
ef00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ef10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d  _OK ){.      tem
ef20: 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  pFile = 1;.    }
ef30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
ef40: 61 74 65 20 74 68 65 20 50 61 67 65 72 20 73 74  ate the Pager st
ef50: 72 75 63 74 75 72 65 2e 20 41 73 20 70 61 72 74  ructure. As part
ef60: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c   of the same all
ef70: 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ocation, allocat
ef80: 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72  e.  ** space for
ef90: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20   the full paths 
efa0: 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72  of the file, dir
efb0: 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e  ectory and journ
efc0: 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e  al .  ** (Pager.
efd0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72  zFilename, Pager
efe0: 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20  .zDirectory and 
eff0: 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e  Pager.zJournal).
f000: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c  .  */.  if( zFul
f010: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
f020: 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65   nameLen = strle
f030: 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  n(zFullPathname)
f040: 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73  ;.    pPager = s
f050: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
f060: 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e  eof(*pPager) + n
f070: 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b  ameLen*3 + 30 );
f080: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 20  .    if( pPager 
f090: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
f0a0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
f0b0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28 63  ->pTmpSpace = (c
f0c0: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
f0d0: 6f 63 52 61 77 28 53 51 4c 49 54 45 5f 44 45 46  ocRaw(SQLITE_DEF
f0e0: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b  AULT_PAGE_SIZE);
f0f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
f100: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
f110: 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  cured in either 
f120: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62  of the blocks ab
f130: 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d 65  ove, free the me
f140: 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74  mory .  ** point
f150: 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61  ed to by zFullPa
f160: 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68 65  thname, free the
f170: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
f180: 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 0a   and close the .
f190: 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65    ** file. Since
f1a0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
f1b0: 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72  t allocated ther
f1c0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
f1d0: 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61  set .  ** any Pa
f1e0: 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69  ger.errMask vari
f1f0: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ables..  */.  if
f200: 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a 46  ( !pPager || !zF
f210: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20 21  ullPathname || !
f220: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
f230: 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  e || rc!=SQLITE_
f240: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
f250: 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  3OsClose(&fd);. 
f260: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
f270: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f280: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
f290: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
f2a0: 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ((rc==SQLITE_OK
f2b0: 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72  )?SQLITE_NOMEM:r
f2c0: 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  c);.  }..  PAGER
f2d0: 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20  TRACE3("OPEN %d 
f2e0: 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
f2f0: 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61  EID(fd), zFullPa
f300: 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41  thname);.  IOTRA
f310: 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
f320: 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a 46 75 6c  n", pPager, zFul
f330: 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20 20 70 50  lPathname)).  pP
f340: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
f350: 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72  = (char*)&pPager
f360: 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  [1];.  pPager->z
f370: 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61  Directory = &pPa
f380: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
f390: 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61  ameLen+1];.  pPa
f3a0: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
f3b0: 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  &pPager->zDirect
f3c0: 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a  ory[nameLen+1];.
f3d0: 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
f3e0: 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c  >zFilename, zFul
f3f0: 6c 50 61 74 68 6e 61 6d 65 2c 20 6e 61 6d 65 4c  lPathname, nameL
f400: 65 6e 2b 31 29 3b 0a 20 20 6d 65 6d 63 70 79 28  en+1);.  memcpy(
f410: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
f420: 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ry, zFullPathnam
f430: 65 2c 20 6e 61 6d 65 4c 65 6e 2b 31 29 3b 0a 0a  e, nameLen+1);..
f440: 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b    for(i=nameLen;
f450: 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
f460: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
f470: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
f480: 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
f490: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
f4a0: 20 3d 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70   = 0;.  memcpy(p
f4b0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
f4c0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e   zFullPathname,n
f4d0: 61 6d 65 4c 65 6e 29 3b 0a 20 20 73 71 6c 69 74  ameLen);.  sqlit
f4e0: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
f4f0: 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  ame);.  memcpy(&
f500: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
f510: 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75  [nameLen], "-jou
f520: 72 6e 61 6c 22 2c 73 69 7a 65 6f 66 28 22 2d 6a  rnal",sizeof("-j
f530: 6f 75 72 6e 61 6c 22 29 29 3b 0a 20 20 70 50 61  ournal"));.  pPa
f540: 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  ger->fd = fd;.  
f550: 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  /* pPager->journ
f560: 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  alOpen = 0; */. 
f570: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
f580: 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
f590: 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50   && !memDb;.  pP
f5a0: 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
f5b0: 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26   = noReadlock &&
f5c0: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
f5d0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
f5e0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
f5f0: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
f600: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f610: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
f620: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
f630: 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
f640: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f650: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
f660: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f  T_PAGE_SIZE;.  /
f670: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
f680: 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
f690: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
f6a0: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
f6b0: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
f6c0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f6d0: 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b 20  ->nMaxPage = 0; 
f6e0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
f6f0: 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 61 73 73  age = 100;.  ass
f700: 65 72 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43  ert( PAGER_UNLOC
f710: 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61  K==0 );.  /* pPa
f720: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
f730: 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
f740: 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
f750: 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
f760: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
f770: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
f780: 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
f790: 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
f7a0: 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
f7b0: 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
f7c0: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
f7d0: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
f7e0: 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
f7f0: 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
f800: 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
f810: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
f820: 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20  e = tempFile; . 
f830: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
f840: 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
f850: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
f860: 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
f870: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
f880: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
f890: 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
f8a0: 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
f8b0: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
f8c0: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
f8d0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
f8e0: 31 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  1);.  /* pPager-
f8f0: 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
f900: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
f910: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
f920: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
f930: 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
f940: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
f950: 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
f960: 6e 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72  nExtra);.  asser
f970: 74 28 66 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20  t(fd||memDb);.  
f980: 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20  if( !memDb ){.  
f990: 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
f9a0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f  pPager);.  }.  /
f9b0: 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
f9c0: 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
f9d0: 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
f9e0: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
f9f0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
fa00: 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67  h)); */.  *ppPag
fa10: 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66  er = pPager;.#if
fa20: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
fa30: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
fa40: 45 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e  ENT.  pPager->pN
fa50: 65 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67  ext = pTsd->pPag
fa60: 65 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67  er;.  pTsd->pPag
fa70: 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e  er = pPager;.#en
fa80: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
fa90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
faa0: 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
fab0: 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
fac0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
fad0: 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
fae0: 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
faf0: 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  , BusyHandler *p
fb00: 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20  BusyHandler){.  
fb10: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
fb20: 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64  dler = pBusyHand
fb30: 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ler;.}../*.** Se
fb40: 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  t the destructor
fb50: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
fb60: 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
fb70: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
fb80: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20   called.** when 
fb90: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
fba0: 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65  unt on each page
fbb0: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
fbc0: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  The destructor c
fbd0: 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  an.** be used to
fbe0: 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d   clean up inform
fbf0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74  ation in the ext
fc00: 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e  ra segment appen
fc10: 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65  ded to each page
fc20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74  ..**.** The dest
fc30: 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61  ructor is not ca
fc40: 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  lled as a result
fc50: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
fc60: 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72  se().  .** Destr
fc70: 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20  uctors are only 
fc80: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
fc90: 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a  3PagerUnref()..*
fca0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
fcb0: 67 65 72 53 65 74 44 65 73 74 72 75 63 74 6f 72  gerSetDestructor
fcc0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
fcd0: 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 44 62  void (*xDesc)(Db
fce0: 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  Page*,int)){.  p
fcf0: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
fd00: 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f  or = xDesc;.}../
fd10: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69  *.** Set the rei
fd20: 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74  nitializer for t
fd30: 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
fd40: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69  ot NULL, the rei
fd50: 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73  nitializer.** is
fd60: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
fd70: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61   content of a pa
fd80: 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72  ge in cache is r
fd90: 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
fda0: 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65  riginal.** value
fdb0: 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
fdc0: 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  a rollback.  The
fdd0: 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20   callback gives 
fde0: 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64  higher-level cod
fdf0: 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e  e.** an opportun
fe00: 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ity to restore t
fe10: 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e  he EXTRA section
fe20: 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
fe30: 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70  he restored.** p
fe40: 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69  age data..*/.voi
fe50: 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
fe60: 74 52 65 69 6e 69 74 65 72 28 50 61 67 65 72 20  tReiniter(Pager 
fe70: 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
fe80: 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
fe90: 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
fea0: 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
feb0: 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  einit;.}../*.** 
fec0: 53 65 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  Set the page siz
fed0: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
fee0: 65 77 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65  ew size.  If the
fef0: 20 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67   suggest new pag
ff00: 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61  e.** size is ina
ff10: 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e  ppropriate, then
ff20: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
ff30: 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c  page size is sel
ff40: 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74  ected.** and ret
ff50: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
ff60: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
ff70: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
ff80: 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a  ger, int pageSiz
ff90: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61  e){.  assert( pa
ffa0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
ffb0: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
ffc0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
ffd0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
ffe0: 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d  memDb && pPager-
fff0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
10000 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
10010 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
10020 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
10030 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72  Size;.    pPager
10040 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
10050 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46 72  lite3ReallocOrFr
10060 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
10070 70 61 63 65 2c 20 70 61 67 65 53 69 7a 65 29 3b  pace, pageSize);
10080 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
10090 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
100a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
100b0 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f  lowing set of ro
100c0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
100d0 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  to disable the s
100e0 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20  imulated.** I/O 
100f0 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e  error mechanism.
10100 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
10110 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f   are used to avo
10120 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  id simulated.** 
10130 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73  errors in places
10140 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
10150 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f   care about erro
10160 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73  rs..**.** Unless
10170 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31   -DSQLITE_TEST=1
10180 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20   is used, these 
10190 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c  routines are all
101a0 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67   no-ops.** and g
101b0 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e  enerate no code.
101c0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
101d0 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e  E_TEST.extern in
101e0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
101f0 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65  or_pending;.exte
10200 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
10210 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61  o_error_hit;.sta
10220 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e  tic int saved_cn
10230 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  t;.void disable_
10240 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10250 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76  ors(void){.  sav
10260 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33  ed_cnt = sqlite3
10270 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
10280 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  g;.  sqlite3_io_
10290 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
102a0 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c  -1;.}.void enabl
102b0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
102c0 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
102d0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
102e0 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f  pending = saved_
102f0 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  cnt;.}.#else.# d
10300 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69  efine disable_si
10310 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
10320 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61  s().# define ena
10330 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
10340 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66  _errors().#endif
10350 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
10360 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66   first N bytes f
10370 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
10380 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  g of the file in
10390 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61  to memory.** tha
103a0 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74  t pDest points t
103b0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72  o. .**.** No err
103c0 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  or checking is d
103d0 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  one. The rationa
103e0 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  l for this is th
103f0 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
10400 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c   .** may be call
10410 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 66  ed even if the f
10420 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
10430 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20  st or contain a 
10440 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74  header. In .** t
10450 68 65 73 65 20 63 61 73 65 73 20 73 71 6c 69 74  hese cases sqlit
10460 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20  e3OsRead() will 
10470 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c  return an error,
10480 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f   to which the co
10490 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e  rrect .** respon
104a0 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68  se is to zero th
104b0 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73  e memory at pDes
104c0 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20  t and continue. 
104d0 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72   A real IO error
104e0 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d   .** will presum
104f0 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62  ably recur and b
10500 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65  e picked up late
10510 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61  r (Todo: Think a
10520 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69  bout this)..*/.i
10530 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
10540 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
10550 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
10560 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
10570 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
10580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10590 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
105a0 20 30 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45   0, N);.  if( ME
105b0 4d 44 42 3d 3d 30 20 29 7b 0a 20 20 20 20 64 69  MDB==0 ){.    di
105c0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
105d0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
105e0 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
105f0 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20  Pager->fd, 0);. 
10600 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
10610 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
10620 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
10630 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
10640 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
10650 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
10660 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
10670 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20 69  pDest, N);.    i
10680 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
10690 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
106a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
106b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
106c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
106d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
106e0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
106f0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
10700 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
10710 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
10720 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ger. .**.** If t
10730 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  he PENDING_BYTE 
10740 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  lies on the page
10750 20 64 69 72 65 63 74 6c 79 20 61 66 74 65 72 20   directly after 
10760 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
10770 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e  * file, then con
10780 73 69 64 65 72 20 74 68 69 73 20 70 61 67 65 20  sider this page 
10790 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
107a0 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c   too. For exampl
107b0 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47  e, if.** PENDING
107c0 5f 42 59 54 45 20 69 73 20 62 79 74 65 20 34 30  _BYTE is byte 40
107d0 39 36 20 28 74 68 65 20 66 69 72 73 74 20 62 79  96 (the first by
107e0 74 65 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e  te of page 5) an
107f0 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
10800 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39  e.** file is 409
10810 36 20 62 79 74 65 73 2c 20 35 20 69 73 20 72 65  6 bytes, 5 is re
10820 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f  turned instead o
10830 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  f 4..*/.int sqli
10840 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
10850 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
10860 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74  {.  i64 n;.  int
10870 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
10880 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66  Pager!=0 );.  if
10890 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
108a0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
108b0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
108c0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
108d0 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72  {.    n = pPager
108e0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c  ->dbSize;.  } el
108f0 73 65 20 7b 0a 20 20 20 20 69 66 28 20 28 72 63  se {.    if( (rc
10900 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
10910 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
10920 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b   &n))!=SQLITE_OK
10930 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
10940 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
10950 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10960 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
10970 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
10980 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
10990 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d      n = 1;.    }
109a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d  else{.      n /=
109b0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
109c0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
109d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
109e0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
109f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
10a00 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  Size = n;.    }.
10a10 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45    }.  if( n==(PE
10a20 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
10a30 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
10a40 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72      n++;.  }.  r
10a50 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66  eturn n;.}...#if
10a60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10a70 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20  _MEMORYDB./*.** 
10a80 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72  Clear a PgHistor
10a90 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  y block.*/.stati
10aa0 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74  c void clearHist
10ab0 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70  ory(PgHistory *p
10ac0 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46  Hist){.  sqliteF
10ad0 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  ree(pHist->pOrig
10ae0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
10af0 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
10b00 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
10b10 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d  0;.  pHist->pStm
10b20 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23  t = 0;.}.#else.#
10b30 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74  define clearHist
10b40 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  ory(x).#endif../
10b50 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63  *.** Forward dec
10b60 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  laration.*/.stat
10b70 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
10b80 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a  al(Pager*);../*.
10b90 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  ** Unlink pPg fr
10ba0 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61  om it's hash cha
10bb0 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65  in. Also set the
10bc0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
10bd0 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a  0 to indicate.**
10be0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
10bf0 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e  s not part of an
10c00 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68  y hash chain. Th
10c10 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62  is is required b
10c20 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71  ecause the.** sq
10c30 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
10c40 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e  ge() routine can
10c50 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69 6e   leave a page in
10c60 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72   the .** pNextFr
10c70 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73  ee/pPrevFree lis
10c80 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
10c90 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68  part of any hash
10ca0 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69  -chain..*/.stati
10cb0 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73  c void unlinkHas
10cc0 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50  hChain(Pager *pP
10cd0 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67  ager, PgHdr *pPg
10ce0 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67  ){.  if( pPg->pg
10cf0 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  no==0 ){.    ass
10d00 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
10d10 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70  ash==0 && pPg->p
10d20 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
10d30 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
10d40 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
10d50 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ash ){.    pPg->
10d60 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
10d70 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
10d80 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28  vHash;.  }.  if(
10d90 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
10da0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
10db0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67  Pager->aHash[pPg
10dc0 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
10dd0 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67  ->nHash-1)]!=pPg
10de0 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
10df0 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73  evHash->pNextHas
10e00 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  h = pPg->pNextHa
10e10 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sh;.  }else{.   
10e20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67   int h = pPg->pg
10e30 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
10e40 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67  ash-1);.    pPag
10e50 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
10e60 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
10e70 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
10e80 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f  {.    clearHisto
10e90 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ry(PGHDR_TO_HIST
10ea0 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a  (pPg, pPager));.
10eb0 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20    }.  pPg->pgno 
10ec0 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78  = 0;.  pPg->pNex
10ed0 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  tHash = pPg->pPr
10ee0 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f  evHash = 0;.}../
10ef0 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61  *.** Unlink a pa
10f00 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
10f10 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20   list (the list 
10f20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65  of all pages whe
10f30 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61  re nRef==0).** a
10f40 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  nd from its hash
10f50 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
10f60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10f70 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64   unlinkPage(PgHd
10f80 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
10f90 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
10fa0 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65  pPager;..  /* Ke
10fb0 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e  ep the pFirstSyn
10fc0 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ced pointer poin
10fd0 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73  ting at the firs
10fe0 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70  t synchronized p
10ff0 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  age */.  if( pPg
11000 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
11010 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67  Synced ){.    Pg
11020 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e  Hdr *p = pPg->pN
11030 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69  extFree;.    whi
11040 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  le( p && p->need
11050 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70  Sync ){ p = p->p
11060 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20  NextFree; }.    
11070 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
11080 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20  nced = p;.  }.. 
11090 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
110a0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
110b0 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
110c0 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
110d0 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
110e0 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
110f0 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  xtFree;.  }else{
11100 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
11110 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67  ger->pFirst==pPg
11120 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
11130 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
11140 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69  extFree;.  }.  i
11150 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
11160 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  e ){.    pPg->pN
11170 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
11180 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
11190 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
111a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
111b0 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a  ->pLast==pPg );.
111c0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
111d0 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
111e0 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ee;.  }.  pPg->p
111f0 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
11200 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a  pPrevFree = 0;..
11210 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
11220 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74   the pgno hash t
11230 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  able */.  unlink
11240 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
11250 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , pPg);.}../*.**
11260 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
11270 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
11280 65 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  e the cache when
11290 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69   a database.** i
112a0 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72  s truncated.  Dr
112b0 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  op from the cach
112c0 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73  e all pages whos
112d0 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72  e pgno is.** lar
112e0 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
112f0 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
11300 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a  nreferenced..**.
11310 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
11320 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
11330 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
11340 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
11350 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68   Actually, at th
11360 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75  e point this rou
11370 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
11380 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  it would be.** a
11390 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  n error to have 
113a0 61 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  a referenced pag
113b0 65 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74  e.  But rather t
113c0 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68  han delete.** th
113d0 61 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72  at page and guar
113e0 61 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65  antee a subseque
113f0 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20  nt segfault, it 
11400 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20  seems better.** 
11410 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68  to zero it and h
11420 6f 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f  ope that we erro
11430 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f  r out sanely..*/
11440 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11450 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
11460 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
11470 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
11480 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a    PgHdr **ppPg;.
11490 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70    int dbSize = p
114a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
114b0 20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72    ppPg = &pPager
114c0 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28  ->pAll;.  while(
114d0 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d   (pPg = *ppPg)!=
114e0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  0 ){.    if( pPg
114f0 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29  ->pgno<=dbSize )
11500 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  {.      ppPg = &
11510 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
11520 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67     }else if( pPg
11530 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20  ->nRef>0 ){.    
11540 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
11550 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
11560 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
11570 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20  );.      ppPg = 
11580 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a  &pPg->pNextAll;.
11590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
115a0 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e   *ppPg = pPg->pN
115b0 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f  extAll;.      IO
115c0 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
115d0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
115e0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
115f0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
11600 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
11610 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
11620 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
11630 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  );.      makeCle
11640 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73  an(pPg);.      s
11650 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
11660 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
11670 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
11680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
11690 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
116a0 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b  n a file.  Invok
116b0 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
116c0 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a  ack if the lock.
116d0 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
116e0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  not available.  
116f0 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65  Repeat until the
11700 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
11710 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20  eturns.** false 
11720 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63  or until the loc
11730 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
11740 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
11750 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
11760 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
11770 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
11780 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
11790 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
117a0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
117b0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
117c0 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
117d0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
117e0 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75  The OS lock valu
117f0 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  es must be the s
11800 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72  ame as the Pager
11810 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a   lock values */.
11820 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
11830 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c  SHARED==SHARED_L
11840 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
11850 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d   PAGER_RESERVED=
11860 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
11870 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
11880 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43  R_EXCLUSIVE==EXC
11890 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
118a0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
118b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
118c0 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20  locked then the 
118d0 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b  size must be unk
118e0 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74  nown */.  assert
118f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
11900 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
11910 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
11920 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20  0 || MEMDB );.. 
11930 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
11940 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  te>=locktype ){.
11950 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11960 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
11970 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
11980 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
11990 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74  Pager->fd, lockt
119a0 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ype);.    }while
119b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
119c0 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f  Y && sqlite3Invo
119d0 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  keBusyHandler(pP
119e0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
119f0 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  er) );.    if( r
11a00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11a10 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
11a20 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ate = locktype;.
11a30 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
11a40 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
11a50 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
11a60 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
11a70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11a80 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66  * Truncate the f
11a90 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ile to the numbe
11aa0 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69  r of pages speci
11ab0 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  fied..*/.int sql
11ac0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
11ad0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
11ae0 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
11af0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
11b00 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
11b10 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
11b20 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69   MEMDB );.  sqli
11b30 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
11b40 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
11b50 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
11b60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
11b70 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
11b80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11b90 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75  .  if( nPage>=(u
11ba0 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
11bb0 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
11bc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11bd0 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20    }.  if( MEMDB 
11be0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
11bf0 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
11c00 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
11c10 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
11c20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11c30 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
11c40 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
11c50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
11c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11c70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11c80 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78  ..  /* Get an ex
11c90 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
11ca0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
11cb0 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20  ore truncating. 
11cc0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
11cd0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
11ce0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
11cf0 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
11d00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11d10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11d20 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
11d30 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
11d40 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
11d50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
11d60 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
11d70 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
11d80 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
11d90 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
11da0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
11db0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
11dc0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
11dd0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
11de0 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
11df0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
11e00 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
11e10 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
11e20 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
11e30 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
11e40 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
11e50 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
11e60 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
11e70 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
11e80 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
11e90 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
11ea0 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
11eb0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
11ec0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
11ed0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
11ee0 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
11ef0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
11f00 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
11f10 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
11f20 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
11f30 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
11f40 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
11f50 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
11f60 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
11f70 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
11f80 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
11f90 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
11fa0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
11fb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
11fc0 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
11fd0 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66  *pPager){.#ifdef
11fe0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
11ff0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
12000 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29  .  /* A malloc()
12010 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20   cannot fail in 
12020 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
12030 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  a() as one or mo
12040 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a  re calls to .  *
12050 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20  * malloc() must 
12060 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
12070 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74  n made by this t
12080 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20  hread before it 
12090 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69  gets.  ** to thi
120a0 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65  s point. This me
120b0 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61  ans the ThreadDa
120c0 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ta must have bee
120d0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65  n allocated alre
120e0 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ady.  ** so that
120f0 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c   ThreadData.nAll
12100 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 0a 20  oc can be set.. 
12110 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61   */.  ThreadData
12120 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
12130 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
12140 61 73 73 65 72 74 28 20 70 50 61 67 65 72 20 29  assert( pPager )
12150 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64  ;.  assert( pTsd
12160 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63   && pTsd->nAlloc
12170 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69   );.#endif..  di
12180 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
12190 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 70  io_errors();.  p
121a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
121b0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   0;.  pPager->ex
121c0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
121d0 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
121e0 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 55  Pager);.  pagerU
121f0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
12200 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e 61 62  (pPager);.  enab
12210 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
12220 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
12230 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25  RTRACE2("CLOSE %
12240 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
12250 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43  ager));.  IOTRAC
12260 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
12270 20 70 50 61 67 65 72 29 29 0a 20 20 61 73 73 65   pPager)).  asse
12280 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
12290 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ode || (pPager->
122a0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26  journalOpen==0 &
122b0 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  & pPager->stmtOp
122c0 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  en==0) );.  if( 
122d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
122e0 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
122f0 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
12300 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73  r->jfd);.  }.  s
12310 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
12320 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
12330 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
12340 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  tOpen ){.    sql
12350 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
12360 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a  ger->stfd);.  }.
12370 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12380 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
12390 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61   /* Temp files a
123a0 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
123b0 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20   deleted by the 
123c0 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67  OS.  ** if( pPag
123d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
123e0 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73    **   sqlite3Os
123f0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
12400 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20  Filename);.  ** 
12410 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  }.  */..#ifdef S
12420 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
12430 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
12440 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
12450 61 67 65 72 20 66 72 6f 6d 20 74 68 65 20 6c 69  ager from the li
12460 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67  nked list of pag
12470 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
12480 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61  .  ** ThreadData
12490 2e 70 50 61 67 65 72 20 69 66 20 6d 65 6d 6f 72  .pPager if memor
124a0 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20  y-management is 
124b0 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20  enabled..  */.  
124c0 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54 73 64  if( pPager==pTsd
124d0 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
124e0 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70  pTsd->pPager = p
124f0 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Pager->pNext;.  
12500 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 67 65 72  }else{.    Pager
12510 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28   *pTmp;.    for(
12520 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50 61  pTmp = pTsd->pPa
12530 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74  ger; pTmp->pNext
12540 21 3d 70 50 61 67 65 72 3b 20 70 54 6d 70 3d 70  !=pPager; pTmp=p
12550 54 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  Tmp->pNext){}.  
12560 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20    pTmp->pNext = 
12570 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pPager->pNext;. 
12580 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
12590 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
125a0 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 46  Hash);.  sqliteF
125b0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
125c0 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65  Space);.  sqlite
125d0 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Free(pPager);.  
125e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
125f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
12600 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
12610 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  r for the given 
12620 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67  page data..*/.Pg
12630 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
12640 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
12650 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
12660 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pgno;.}../*.**
12670 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20   The page_ref() 
12680 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65  function increme
12690 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  nts the referenc
126a0 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
126b0 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ge..** If the pa
126c0 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
126d0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
126e0 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63  (the reference c
126f0 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68  ount is zero) th
12700 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20  en.** remove it 
12710 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
12720 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e  t..**.** For non
12730 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70  -test systems, p
12740 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d  age_ref() is a m
12750 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20  acro that calls 
12760 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f  _page_ref().** o
12770 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66  nline of the ref
12780 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
12790 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20  zero.  For test 
127a0 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
127b0 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c  f().** is a real
127c0 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61   function so tha
127d0 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65  t we can set bre
127e0 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61  akpoints and tra
127f0 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ce it..*/.static
12800 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28   void _page_ref(
12810 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
12820 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
12830 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
12840 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
12850 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
12860 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a    Remove it. */.
12870 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67      if( pPg==pPg
12880 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
12890 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20  Synced ){.      
128a0 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
128b0 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20  pNextFree;.     
128c0 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
128d0 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
128e0 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
128f0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
12900 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
12910 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = p;.    }.    i
12920 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
12930 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
12940 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
12950 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
12960 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tFree;.    }else
12970 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
12980 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
12990 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
129a0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
129b0 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
129c0 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
129d0 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
129e0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
129f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12a00 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c   pPg->pPager->pL
12a10 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
12a20 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
12a30 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  pPg->pPager->nRe
12a40 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  f++;.  }.  pPg->
12a50 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46  nRef++;.  REFINF
12a60 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66  O(pPg);.}.#ifdef
12a70 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
12a80 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
12a90 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
12aa0 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
12ab0 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
12ac0 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a  _page_ref(pPg);.
12ad0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12ae0 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
12af0 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
12b00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
12b10 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f  e.# define page_
12b20 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e  ref(P)   ((P)->n
12b30 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66  Ref==0?_page_ref
12b40 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e  (P):(void)(P)->n
12b50 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f  Ref++).#endif../
12b60 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
12b70 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
12b80 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
12b90 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65  The input pointe
12ba0 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  r is.** a refere
12bb0 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  nce to the page 
12bc0 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  data..*/.int sql
12bd0 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50  ite3PagerRef(DbP
12be0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61 67  age *pPg){.  pag
12bf0 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65  e_ref(pPg);.  re
12c00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12c10 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
12c20 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f  e journal.  In o
12c30 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
12c40 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
12c50 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
12c60 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
12c70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
12c80 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
12c90 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
12ca0 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20  f the.** disk.  
12cb0 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  It is not safe t
12cc0 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69  o modify the ori
12cd0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
12ce0 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a  ile until after.
12cf0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
12d00 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20  as been synced. 
12d10 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
12d20 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64   database is mod
12d30 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ified before.** 
12d40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
12d50 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65  ynced and a powe
12d60 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
12d70 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a  , the unsynced j
12d80 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77  ournal.** data w
12d90 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64  ould be lost and
12da0 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61   we would be una
12db0 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  ble to completel
12dc0 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a  y rollback the.*
12dd0 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
12de0 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  es.  Database co
12df0 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f  rruption would o
12e00 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  ccur..** .** Thi
12e10 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75  s routine also u
12e20 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20  pdates the nRec 
12e30 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61  field in the hea
12e40 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
12e50 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d  al..** (See comm
12e60 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ents on the page
12e70 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
12e80 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
12e90 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
12ea0 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63  ).** If the sync
12eb0 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74   mode is FULL, t
12ec0 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63  wo syncs will oc
12ed0 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20  cur.  First the 
12ee0 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  whole journal.**
12ef0 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e   is synced, then
12f00 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
12f10 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e  is updated, then
12f20 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f   a second sync o
12f30 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ccurs..**.** For
12f40 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
12f50 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20  ases, we do not 
12f60 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61  care if we are a
12f70 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  ble to rollback.
12f80 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72  ** after a power
12f90 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e   failure, so syn
12fa0 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
12fb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  This routine cle
12fc0 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ars the needSync
12fd0 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20   field of every 
12fe0 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c  page current hel
12ff0 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a  d in.** memory..
13000 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
13010 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
13020 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
13030 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
13040 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
13050 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
13060 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
13070 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
13080 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
13090 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
130a0 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
130b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
130c0 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
130d0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
130e0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  c ){.    if( !pP
130f0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
13100 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13110 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13120 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  pen );.      /* 
13130 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
13140 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f  >noSync ); // no
13150 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65  Sync might be se
13160 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  t if synchronous
13170 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75  .      ** was tu
13180 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20 74  rned off after t
13190 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
131a0 61 73 20 73 74 61 72 74 65 64 2e 20 20 54 69 63  as started.  Tic
131b0 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e  ket #615 */.#ifn
131c0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20  def NDEBUG.     
131d0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   {.        /* Ma
131e0 6b 65 20 73 75 72 65 20 74 68 65 20 70 50 61 67  ke sure the pPag
131f0 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72  er->nRec counter
13200 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20   we are keeping 
13210 61 67 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a  agrees.        *
13220 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20  * with the nRec 
13230 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
13240 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
13250 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
13260 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
13270 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20  64 jSz;.        
13280 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
13290 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
132a0 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20  fd, &jSz);.     
132b0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
132c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
132d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
132e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53  ->journalOff==jS
132f0 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  z );.      }.#en
13300 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
13310 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
13320 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
13330 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13340 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
13350 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
13360 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
13370 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
13380 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
13390 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
133a0 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
133b0 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
133c0 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
133d0 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
133e0 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
133f0 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
13400 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
13410 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
13420 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
13430 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
13440 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
13450 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
13460 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
13470 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
13480 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
13490 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
134a0 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
134b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
134c0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
134d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
134e0 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
134f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
13500 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13510 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
13520 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20  er->jfd,.       
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13540 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
13550 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
13560 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
13570 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
13580 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
13590 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
135a0 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
135b0 22 2c 20 70 50 61 67 65 72 2c 0a 20 20 20 20 20  ", pPager,.     
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
135d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
135e0 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
135f0 6c 4d 61 67 69 63 29 2c 20 34 29 29 0a 20 20 20  lMagic), 4)).   
13600 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
13610 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
13620 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  d, pPager->nRec)
13630 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13640 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
13650 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13660 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
13670 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
13680 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
13690 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
136a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
136b0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
136c0 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  2("SYNC journal 
136d0 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
136e0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
136f0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
13700 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
13710 29 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ).      rc = sql
13720 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
13730 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
13740 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20  full_fsync);.   
13750 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
13760 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13770 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
13780 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
13790 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
137a0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
137b0 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65   /* Erase the ne
137c0 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d  edSync flag from
137d0 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20   every page..   
137e0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   */.    for(pPg=
137f0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
13800 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
13810 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
13820 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
13830 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
13840 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
13850 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
13860 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  .  }..#ifndef ND
13870 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65  EBUG.  /* If the
13880 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
13890 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68  flag is clear th
138a0 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  en the PgHdr.nee
138b0 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20  dSync.  ** flag 
138c0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65  must also be cle
138d0 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  ar for all pages
138e0 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
138f0 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61  his.  ** invaria
13900 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f  nt is true..  */
13910 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72  .  else{.    for
13920 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
13930 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
13940 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
13950 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
13960 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
13970 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
13980 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
13990 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46  nced==pPager->pF
139a0 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  irst );.  }.#end
139b0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
139c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20  .}../*.** Merge 
139d0 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70 61 67  two lists of pag
139e0 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  es connected by 
139f0 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20 70 67  pDirty and in pg
13a00 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20  no order..** Do 
13a10 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e 67 20  not both fixing 
13a20 74 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70  the pPrevDirty p
13a30 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  ointers..*/.stat
13a40 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67 65 5f  ic PgHdr *merge_
13a50 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
13a60 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29 7b 0a  pA, PgHdr *pB){.
13a70 20 20 50 67 48 64 72 20 72 65 73 75 6c 74 2c 20    PgHdr result, 
13a80 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20  *pTail;.  pTail 
13a90 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77 68 69  = &result;.  whi
13aa0 6c 65 28 20 70 41 20 26 26 20 70 42 20 29 7b 0a  le( pA && pB ){.
13ab0 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f      if( pA->pgno
13ac0 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  <pB->pgno ){.   
13ad0 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
13ae0 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 54 61   = pA;.      pTa
13af0 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  il = pA;.      p
13b00 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a  A = pA->pDirty;.
13b10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13b20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
13b30 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61 69 6c   pB;.      pTail
13b40 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 42 20   = pB;.      pB 
13b50 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20  = pB->pDirty;.  
13b60 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 41    }.  }.  if( pA
13b70 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70   ){.    pTail->p
13b80 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65  Dirty = pA;.  }e
13b90 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a 20 20  lse if( pB ){.  
13ba0 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
13bb0 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = pB;.  }else{. 
13bc0 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
13bd0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
13be0 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72 74 79  rn result.pDirty
13bf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20  ;.}../*.** Sort 
13c00 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
13c10 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
13c20 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20 20 50  rder by pgno.  P
13c30 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e  ages are.** conn
13c40 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
13c50 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 20 70  pointers.  The p
13c60 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65  PrevDirty pointe
13c70 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70  rs are.** corrup
13c80 74 65 64 20 62 79 20 74 68 69 73 20 73 6f 72 74  ted by this sort
13c90 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53  ..*/.#define N_S
13ca0 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43  ORT_BUCKET_ALLOC
13cb0 20 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f   25.#define N_SO
13cc0 52 54 5f 42 55 43 4b 45 54 20 20 20 20 20 20 20  RT_BUCKET       
13cd0 32 35 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  25.#ifdef SQLITE
13ce0 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71 6c 69  _TEST.  int sqli
13cf0 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74  te3_pager_n_sort
13d00 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20 20 23  _bucket = 0;.  #
13d10 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42 55 43  undef N_SORT_BUC
13d20 4b 45 54 0a 20 20 23 64 65 66 69 6e 65 20 4e 5f  KET.  #define N_
13d30 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a 20 20  SORT_BUCKET \.  
13d40 20 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   (sqlite3_pager_
13d50 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f 73 71  n_sort_bucket?sq
13d60 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
13d70 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f 52 54  rt_bucket:N_SORT
13d80 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23  _BUCKET_ALLOC).#
13d90 65 6e 64 69 66 0a 73 74 61 74 69 63 20 50 67 48  endif.static PgH
13da0 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73  dr *sort_pagelis
13db0 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20  t(PgHdr *pIn){. 
13dc0 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54   PgHdr *a[N_SORT
13dd0 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20  _BUCKET_ALLOC], 
13de0 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d  *p;.  int i;.  m
13df0 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65  emset(a, 0, size
13e00 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65 28  of(a));.  while(
13e10 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20   pIn ){.    p = 
13e20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70  pIn;.    pIn = p
13e30 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d  ->pDirty;.    p-
13e40 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
13e50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f   for(i=0; i<N_SO
13e60 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b  RT_BUCKET-1; i++
13e70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69  ){.      if( a[i
13e80 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
13e90 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20  a[i] = p;.      
13ea0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
13eb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20  else{.        p 
13ec0 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
13ed0 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20  (a[i], p);.     
13ee0 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20     a[i] = 0;.   
13ef0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
13f00 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43  f( i==N_SORT_BUC
13f10 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20 2f  KET-1 ){.      /
13f20 2a 20 43 6f 76 65 72 61 67 65 3a 20 54 6f 20 67  * Coverage: To g
13f30 65 74 20 68 65 72 65 2c 20 74 68 65 72 65 20 6e  et here, there n
13f40 65 65 64 20 74 6f 20 62 65 20 32 5e 28 4e 5f 53  eed to be 2^(N_S
13f50 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a 20 20 20  ORT_BUCKET) .   
13f60 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69     ** elements i
13f70 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 69 73 74  n the input list
13f80 2e 20 54 68 69 73 20 69 73 20 70 6f 73 73 69 62  . This is possib
13f90 6c 65 2c 20 62 75 74 20 69 6d 70 72 61 63 74 69  le, but impracti
13fa0 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20 54 65  cal..      ** Te
13fb0 73 74 69 6e 67 20 74 68 69 73 20 6c 69 6e 65 20  sting this line 
13fc0 69 73 20 74 68 65 20 70 6f 69 6e 74 20 6f 66 20  is the point of 
13fd0 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 0a  global variable.
13fe0 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
13ff0 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75  _pager_n_sort_bu
14000 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cket..      */. 
14010 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67       a[i] = merg
14020 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c  e_pagelist(a[i],
14030 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   p);.    }.  }. 
14040 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72   p = a[0];.  for
14050 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42  (i=1; i<N_SORT_B
14060 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20  UCKET; i++){.   
14070 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c   p = merge_pagel
14080 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20  ist(p, a[i]);.  
14090 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
140a0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c  ./*.** Given a l
140b0 69 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f  ist of pages (co
140c0 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50  nnected by the P
140d0 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
140e0 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76  ter) write.** ev
140f0 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ery one of those
14100 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68   pages out to th
14110 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14120 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c  and mark them al
14130 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a  l.** as clean..*
14140 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
14150 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
14160 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b  t(PgHdr *pList){
14170 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
14180 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
14190 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
141a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
141b0 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
141c0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
141d0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
141e0 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
141f0 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
14200 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
14210 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
14220 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
14230 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
14240 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
14250 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
14260 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
14270 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65  ite3OsLock() are
14280 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20   no-ops..  **.  
14290 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f  ** Moving the lo
142a0 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44  ck from RESERVED
142b0 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63   to EXCLUSIVE ac
142c0 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20  tually involves 
142d0 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75  going.  ** throu
142e0 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  gh an intermedia
142f0 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47  te state PENDING
14300 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  .   A PENDING lo
14310 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a  ck prevents new.
14320 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f    ** readers fro
14330 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74  m attaching to t
14340 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20  he database but 
14350 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20  is unsufficient 
14360 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77  for us to.  ** w
14370 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20  rite.  The idea 
14380 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  of a PENDING loc
14390 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20  k is to prevent 
143a0 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d  new readers from
143b0 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20  .  ** coming in 
143c0 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f  while we wait fo
143d0 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65  r existing reade
143e0 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a  rs to clear..  *
143f0 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65  *.  ** While the
14400 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
14410 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
14420 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
14430 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
14440 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
14450 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63  d we can rollbac
14460 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
14470 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65   to playback the
14480 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e  .  ** journal in
14490 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
144a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
144b0 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69  Once we transiti
144c0 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55  on to.  ** EXCLU
144d0 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74  SIVE, it means t
144e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
144f0 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
14500 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61  d and any rollba
14510 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71  ck.  ** will req
14520 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70  uire a journal p
14530 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  layback..  */.  
14540 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
14550 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
14560 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
14570 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
14590 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c  rn rc;.  }..  pL
145a0 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c  ist = sort_pagel
145b0 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 77 68  ist(pList);.  wh
145c0 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20  ile( pList ){.  
145d0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
145e0 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 72 63  >dirty );.    rc
145f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
14600 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c  (pPager->fd, (pL
14610 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36  ist->pgno-1)*(i6
14620 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
14630 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ze);.    if( rc 
14640 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
14650 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
14660 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
14670 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
14680 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
14690 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
146a0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
146b0 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
146c0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
146d0 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  te() was called 
146e0 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
146f0 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
14700 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
14710 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
14720 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
14730 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
14740 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
14750 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14760 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50   pList->pgno<=pP
14770 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
14780 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
14790 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  a = CODEC2(pPage
147a0 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
147b0 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e  (pList), pList->
147c0 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20  pgno, 6);.      
147d0 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4f  PAGERTRACE3("STO
147e0 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
147f0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
14800 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ), pList->pgno);
14810 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
14820 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
14830 20 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e   pPager, pList->
14840 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
14850 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
14860 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
14870 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
14880 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 50 41  eSize);.      PA
14890 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
148a0 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
148b0 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47  ount);.      PAG
148c0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
148d0 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69  nWrite);.      i
148e0 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d  f( pList->pgno==
148f0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
14900 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
14910 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
14920 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
14930 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
14940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14950 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
14960 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50     else{.      P
14970 41 47 45 52 54 52 41 43 45 33 28 22 4e 4f 53 54  AGERTRACE3("NOST
14980 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
14990 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
149a0 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  r), pList->pgno)
149b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
149c0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
149d0 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74  rn rc;.    pList
149e0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66  ->dirty = 0;.#if
149f0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
14a00 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74  _PAGES.    pList
14a10 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
14a20 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
14a30 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  t);.#endif.    p
14a40 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
14a50 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75  irty;.  }.  retu
14a60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14a70 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65  ./*.** Collect e
14a80 76 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20  very dirty page 
14a90 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73  into a dirty lis
14aa0 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  t and.** return 
14ab0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
14ac0 20 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69   head of that li
14ad0 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61  st.  All pages a
14ae0 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20  re.** collected 
14af0 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65  even if they are
14b00 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a   still in use..*
14b10 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
14b20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
14b30 72 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20  rty_pages(Pager 
14b40 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
14b50 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74  rn pPager->pDirt
14b60 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
14b70 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 72 65  rn TRUE if there
14b80 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
14b90 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  l on the given p
14ba0 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a  ager..** A hot j
14bb0 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
14bc0 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  at needs to be p
14bd0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  layed back..**.*
14be0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
14bf0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
14c00 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
14c10 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
14c20 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
14c30 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
14c40 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
14c50 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
14c60 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
14c70 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
14c80 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74  ame.  Just delet
14c90 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
14ca0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
14cb0 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
14cc0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
14cd0 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   !pPager->useJou
14ce0 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b  rnal ) return 0;
14cf0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 4f  .  if( !sqlite3O
14d00 73 46 69 6c 65 45 78 69 73 74 73 28 70 50 61 67  sFileExists(pPag
14d10 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b  er->zJournal) ){
14d20 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
14d30 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
14d40 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
14d50 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20  ock(pPager->fd) 
14d60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
14d70 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
14d80 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
14d90 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20  (pPager)==0 ){. 
14da0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
14db0 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
14dc0 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nal);.    return
14dd0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
14de0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
14df0 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66  ../*.** Try to f
14e00 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
14e10 65 20 63 61 63 68 65 20 74 68 61 74 20 63 61 6e  e cache that can
14e20 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a   be recycled. .*
14e30 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14e40 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  e may return SQL
14e50 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
14e60 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45  E_FULL or SQLITE
14e70 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73  _OK. It .** does
14e80 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50 61   not set the pPa
14e90 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61 72  ger->errCode var
14ea0 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
14eb0 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79 63   int pager_recyc
14ec0 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
14ed0 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50 67  , int syncOk, Pg
14ee0 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50  Hdr **ppPg){.  P
14ef0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70  gHdr *pPg;.  *pp
14f00 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  Pg = 0;..  asser
14f10 74 28 21 4d 45 4d 44 42 29 3b 0a 0a 20 20 2f 2a  t(!MEMDB);..  /*
14f20 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20   Find a page to 
14f30 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f  recycle.  Try to
14f40 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74   locate a page t
14f50 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a  hat does not.  *
14f60 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20  * require us to 
14f70 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e  do an fsync() on
14f80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20   the journal..  
14f90 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65  */.  pPg = pPage
14fa0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r->pFirstSynced;
14fb0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75  ..  /* If we cou
14fc0 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61  ld not find a pa
14fd0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
14fe0 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e   require an fsyn
14ff0 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  c().  ** on the 
15000 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
15010 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n fsync the jour
15020 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
15030 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73  is a.  ** very s
15040 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73  low operation, s
15050 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74  o we work hard t
15060 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74  o avoid it.  But
15070 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20   sometimes.  ** 
15080 69 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70  it can't be help
15090 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
150a0 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  Pg==0 && pPager-
150b0 3e 70 46 69 72 73 74 20 26 26 20 73 79 6e 63 4f  >pFirst && syncO
150c0 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20  k && !MEMDB){.  
150d0 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a    int rc = syncJ
150e0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
150f0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
15100 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
15110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15120 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
15130 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
15140 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
15150 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a  e, write a new j
15160 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
15170 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
15180 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
15190 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76  is is done to av
151a0 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69  oid ever modifyi
151b0 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ng a journal.   
151c0 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61     ** header tha
151d0 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  t is involved in
151e0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66   the rollback of
151f0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
15200 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
15210 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
15220 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
15230 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64  in case the head
15240 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74  er is.      ** t
15250 72 61 73 68 65 64 20 77 68 65 6e 20 74 68 65 20  rashed when the 
15260 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
15270 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f  dated)..      */
15280 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
15290 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  Rec = 0;.      a
152a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
152b0 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b  ournalOff > 0 );
152c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
152d0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
152e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
152f0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
15300 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
15310 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
15320 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
15330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15340 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
15350 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69  >pFirst;.  }.  i
15360 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
15370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15380 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  K;.  }..  assert
15390 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
153a0 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
153b0 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61  e page to the da
153c0 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69  tabase file if i
153d0 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f  t is dirty..  */
153e0 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
153f0 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  y ){.    int rc;
15400 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
15410 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
15420 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
15430 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  Pg);.    pPg->di
15440 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  rty = 1;.    pPg
15450 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
15460 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
15470 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67  te_pagelist( pPg
15480 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
15490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
154a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
154b0 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
154c0 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
154d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
154e0 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79  page we are recy
154f0 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20  cling is marked 
15500 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
15510 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74  k, then.  ** set
15520 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61   the global alwa
15530 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c  ysRollback flag,
15540 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20   thus disabling 
15550 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
15560 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
15570 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  k() optimization
15580 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66   for the rest of
15590 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
155a0 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65  n..  ** It is ne
155b0 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68  cessary to do th
155c0 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70  is because the p
155d0 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  age marked alway
155e0 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d  sRollback.  ** m
155f0 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64  ight be reloaded
15600 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65   at a later time
15610 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69   but at that poi
15620 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65  nt we won't reme
15630 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69  mber.  ** that i
15640 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77  s was marked alw
15650 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  aysRollback.  Th
15660 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c  is means that al
15670 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a  l pages must.  *
15680 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61  * be marked as a
15690 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72  lwaysRollback fr
156a0 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a  om here on out..
156b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
156c0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
156d0 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
156e0 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20  ALWAYS_ROLLBACK 
156f0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
15700 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61      pPager->alwa
15710 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
15720 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
15730 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72   the old page fr
15740 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
15750 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61   and the hash ta
15760 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e  ble.  */.  unlin
15770 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 61 73  kPage(pPg);.  as
15780 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d  sert( pPg->pgno=
15790 3d 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d  =0 );..  *ppPg =
157a0 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
157b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
157c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
157d0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72   is called to fr
157e0 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64  ee superfluous d
157f0 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
15800 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68  ated memory.** h
15810 65 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72  eld by the pager
15820 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20   system. Memory 
15830 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51  in use by any SQ
15840 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63  Lite pager alloc
15850 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  ated.** by the c
15860 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61  urrent thread ma
15870 79 20 62 65 20 73 71 6c 69 74 65 46 72 65 65 28  y be sqliteFree(
15880 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20  )ed..**.** nReq 
15890 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
158a0 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
158b0 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20   required. Once 
158c0 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a  this much has.**
158d0 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20   been released, 
158e0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
158f0 75 72 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65  urns. A negative
15900 20 76 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20   value for nReq 
15910 6d 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73  means.** free as
15920 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
15930 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65  possible. The re
15940 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
15950 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a  e total number .
15960 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  ** of bytes of m
15970 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a  emory released..
15980 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
15990 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
159a0 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71  ANAGEMENT.int sq
159b0 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73  lite3PagerReleas
159c0 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71  eMemory(int nReq
159d0 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61  ){.  const Threa
159e0 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20 3d 20  dData *pTsdro = 
159f0 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
15a00 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69  aReadOnly();.  i
15a10 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30  nt nReleased = 0
15a20 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
15a30 20 49 66 20 74 68 65 20 74 68 65 20 67 6c 6f 62   If the the glob
15a40 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  al mutex is held
15a50 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
15a60 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a  e becomes a.  **
15a70 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65   o-op; zero byte
15a80 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65 20  s of memory are 
15a90 66 72 65 65 64 2e 20 20 54 68 69 73 20 69 73 20  freed.  This is 
15aa0 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d  because.  ** som
15ab0 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e  e of the code in
15ac0 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20 66 75  voked by this fu
15ad0 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a  nction may also.
15ae0 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74 61    ** try to obta
15af0 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20 72 65  in the mutex, re
15b00 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64 65 61  sulting in a dea
15b10 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66  dlock..  */.  if
15b20 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74  ( sqlite3OsInMut
15b30 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72 65 74  ex(0) ){.    ret
15b40 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
15b50 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20   Outermost loop 
15b60 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74  runs for at most
15b70 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e   two iterations.
15b80 20 46 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   First iteration
15b90 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20   we.  ** try to 
15ba0 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74  find memory that
15bb0 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
15bc0 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67   without calling
15bd0 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64   fsync(). Second
15be0 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20  .  ** iteration 
15bf0 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73  (which only runs
15c00 20 69 66 20 74 68 65 20 66 69 72 73 74 20 66 61   if the first fa
15c10 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65  iled to free nRe
15c20 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20  q bytes of.  ** 
15c30 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69  memory) is permi
15c40 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79  tted to call fsy
15c50 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66  nc(). This is of
15c60 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72   course much mor
15c70 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76  e .  ** expensiv
15c80 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
15c90 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a  0; i<=1; i++){..
15ca0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
15cb0 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51 4c 69  ugh all the SQLi
15cc0 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e 65 64  te pagers opened
15cd0 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
15ce0 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 50  thread. */.    P
15cf0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
15d00 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b 0a 20  Tsdro->pPager;. 
15d10 20 20 20 66 6f 72 28 20 3b 20 70 50 61 67 65 72     for( ; pPager
15d20 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e   && (nReq<0 || n
15d30 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b 20  Released<nReq); 
15d40 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70  pPager=pPager->p
15d50 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48  Next){.      PgH
15d60 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69  dr *pPg;.      i
15d70 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 69 66  nt rc;..      if
15d80 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
15d90 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
15da0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
15db0 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20 74  or each pager, t
15dc0 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61  ry to free as ma
15dd0 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73 73  ny pages as poss
15de0 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20  ible (without . 
15df0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20       ** calling 
15e00 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73 20  fsync() if this 
15e10 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74 65  is the first ite
15e20 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75  ration of the ou
15e30 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a  termost .      *
15e40 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a  * loop)..      *
15e50 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 53  /.      while( S
15e60 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
15e70 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50  pager_recycle(pP
15e80 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 29 20  ager, i, &pPg)) 
15e90 26 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20 20  && pPg) {.      
15ea0 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64    /* We've found
15eb0 20 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e   a page to free.
15ec0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
15ed0 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
15ee0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d   .        ** rem
15ef0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  oved from the pa
15f00 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66  ge hash-table, f
15f10 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e  ree-list and syn
15f20 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20  ced-list .      
15f30 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63    ** (pFirstSync
15f40 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c  ed). It is still
15f50 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65   in the all page
15f60 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a  s (pAll) list. .
15f70 20 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76          ** Remov
15f80 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c  e it from this l
15f90 69 73 74 20 62 65 66 6f 72 65 20 66 72 65 65 69  ist before freei
15fa0 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ng..        **. 
15fb0 20 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20         ** Todo: 
15fc0 43 68 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e  Check the Pager.
15fd0 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61  pStmt list to ma
15fe0 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20  ke sure this is 
15ff0 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20  Ok. It .        
16000 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74  ** probably is t
16010 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20 2a  hough..        *
16020 2f 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20  /.        PgHdr 
16030 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61  *pTmp;.        a
16040 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20  ssert( pPg );.  
16050 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
16060 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
16070 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
16080 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e  ->pAll = pPg->pN
16090 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20  extAll;.        
160a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
160b0 20 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67 65   for( pTmp=pPage
160c0 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70  r->pAll; pTmp->p
160d0 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54  NextAll!=pPg; pT
160e0 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c  mp=pTmp->pNextAl
160f0 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20  l ){}.          
16100 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d  pTmp->pNextAll =
16110 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
16120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16130 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73    nReleased += s
16140 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70  qliteAllocSize(p
16150 50 67 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  Pg);.        IOT
16160 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70  RACE(("PGFREE %p
16170 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
16180 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
16190 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
161a0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67  sqlite3_pager_pg
161b0 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  free_count);.   
161c0 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
161d0 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  pPg);.      }.. 
161e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
161f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16200 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63    /* An error oc
16210 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  cured whilst wri
16220 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
16230 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20  base file or .  
16240 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
16250 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c   in pager_recycl
16260 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69  e(). The error i
16270 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74  s not returned t
16280 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  o the .        *
16290 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73  * caller of this
162a0 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65   function. Inste
162b0 61 64 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ad, set the Page
162c0 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  r.errCode variab
162d0 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  le..        ** T
162e0 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65  he error will be
162f0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
16300 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c   user (or users,
16310 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20   in the case .  
16320 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68        ** of a sh
16330 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65  ared pager cache
16340 29 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66  ) of the pager f
16350 6f 72 20 77 68 69 63 68 20 74 68 65 20 65 72 72  or which the err
16360 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20  or occured..    
16370 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
16380 73 73 65 72 74 28 20 28 72 63 26 30 78 66 66 29  ssert( (rc&0xff)
16390 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c  ==SQLITE_IOERR |
163a0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  | rc==SQLITE_FUL
163b0 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  L );.        ass
163c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
163d0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
163e0 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61  ED );.        pa
163f0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
16400 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , rc);.      }. 
16410 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
16420 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a  rn nReleased;.}.
16430 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
16440 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
16450 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a  ANAGEMENT */../*
16460 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
16470 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50 67  tent of page pPg
16480 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61   out of the data
16490 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
164a0 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50  atic int readDbP
164b0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
164c0 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20 50  r, PgHdr *pPg, P
164d0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
164e0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 4d   rc;.  assert( M
164f0 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 72 63 20  EMDB==0 );.  rc 
16500 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
16510 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
16520 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
16530 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  ->pageSize);.  i
16540 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16550 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
16560 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
16570 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f  r->fd, PGHDR_TO_
16580 44 41 54 41 28 70 50 67 29 2c 0a 20 20 20 20 20  DATA(pPg),.     
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
165b0 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 50 41  eSize);.  }.  PA
165c0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
165d0 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
165e0 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
165f0 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
16600 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
16610 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
16620 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
16630 50 41 47 45 52 54 52 41 43 45 33 28 22 46 45 54  PAGERTRACE3("FET
16640 43 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  CH %d page %d\n"
16650 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
16660 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
16670 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
16680 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
16690 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
166a0 26 28 28 75 38 2a 29 50 47 48 44 52 5f 54 4f 5f  &((u8*)PGHDR_TO_
166b0 44 41 54 41 28 70 50 67 29 29 5b 32 34 5d 2c 0a  DATA(pPg))[24],.
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
166f0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
16700 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20  ileVers));.  }. 
16710 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
16720 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
16730 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  g), pPg->pgno, 3
16740 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16750 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
16760 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
16770 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
16780 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75  shared lock requ
16790 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64  ired before.** d
167a0 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64 20  ata may be read 
167b0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
167c0 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68 61  ache. If the sha
167d0 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72  red lock has alr
167e0 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74  eady.** been obt
167f0 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  ained, this func
16800 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
16810 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65  .**.** Immediate
16820 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69  ly after obtaini
16830 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ng the shared lo
16840 63 6b 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ck (if required)
16850 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
16860 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20  ** checks for a 
16870 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
16880 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e  . If one is foun
16890 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20  d, an emergency 
168a0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70  rollback.** is p
168b0 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61  erformed immedia
168c0 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
168d0 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64 4c  int pagerSharedL
168e0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
168f0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
16900 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
16910 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
16920 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
16930 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
16940 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
16950 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
16960 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
16970 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
16980 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
16990 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
169a0 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
169b0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
169c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
169d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
169e0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
169f0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
16a00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16a10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
16a20 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
16a30 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
16a40 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
16a50 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
16a60 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
16a70 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
16a80 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
16a90 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
16aa0 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
16ab0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
16ac0 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
16ad0 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  leted..      */.
16ae0 20 20 20 20 20 20 69 66 28 20 68 61 73 48 6f 74        if( hasHot
16af0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20  Journal(pPager) 
16b00 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ){.        /* Ge
16b10 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
16b20 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
16b30 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
16b40 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
16b50 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
16b60 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
16b70 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
16b80 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
16b90 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
16ba0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
16bb0 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
16bc0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
16bd0 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
16be0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62          ** datab
16bf0 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
16c00 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
16c10 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
16c20 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
16c30 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
16c40 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
16c50 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
16c60 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
16c70 67 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  g it .        **
16c80 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   back..        *
16c90 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65  * .        ** Be
16ca0 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
16cb0 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
16cc0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
16cd0 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20  ested, the.     
16ce0 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f     ** second pro
16cf0 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f  cess will get to
16d00 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
16d10 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
16d20 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f   to.        ** o
16d30 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45  btain it's own E
16d40 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
16d50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16d60 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
16d70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16d80 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
16d90 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
16da0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
16db0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61   ){.          pa
16dd0 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
16de0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
16df0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
16e00 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
16e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16e20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
16e30 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
16e40 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  . .        /* Op
16e50 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
16e60 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e  or reading only.
16e70 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
16e80 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 20  BUSY if.        
16e90 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  ** we are unable
16ea0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
16eb0 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20  rnal file. .    
16ec0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
16ed0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
16ee0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  le does not need
16ef0 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74   to be locked it
16f00 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20  self.  The.     
16f10 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
16f20 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e  le is never open
16f30 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e   unless the main
16f40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
16f50 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  olds.        ** 
16f60 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f  a write lock, so
16f70 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
16f80 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77  any chance of tw
16f90 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20  o or more.      
16fa0 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f    ** processes o
16fb0 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  pening the journ
16fc0 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  al at the same t
16fd0 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ime..        **.
16fe0 09 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75  .** Open the jou
16ff0 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
17000 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73  ite access. This
17010 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a   is because in .
17020 09 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63  .** exclusive-ac
17030 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
17040 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
17050 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
17060 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  and.        ** p
17070 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
17080 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
17090 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65  ater on. On some
170a0 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20   systems, the.  
170b0 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63        ** OsTrunc
170c0 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20  ate() call used 
170d0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
170e0 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65  ess mode also re
170f0 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a  quires.        *
17100 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66  * a read/write f
17110 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ile handle..    
17120 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
17130 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
17140 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
17150 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
17160 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
17170 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
17180 69 6e 74 20 72 6f 3b 0a 20 20 20 20 20 20 20 20  int ro;.        
17190 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
171a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
171b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
171c0 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
171d0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  rite(pPager->zJo
171e0 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
171f0 6a 66 64 2c 20 26 72 6f 29 3b 0a 20 20 20 20 20  jfd, &ro);.     
17200 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
17210 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
17220 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 20  ager->jfd );.   
17230 20 20 20 20 20 20 20 69 66 28 20 72 6f 20 29 7b         if( ro ){
17240 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
17250 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
17260 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17270 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
17280 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
17290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
172a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
172b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
172c0 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
172d0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
172e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
172f0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
17300 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
17310 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
17320 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 1;.        pPa
17330 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
17340 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ted = 0;.       
17350 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17360 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Off = 0;.       
17370 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
17380 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
17390 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
173a0 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20  dr = 0;. .      
173b0 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
173c0 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
173d0 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
173e0 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
173f0 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61         ** lock a
17400 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
17410 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20   read lock..    
17420 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
17430 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
17440 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
17450 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
17460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17470 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
17480 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
17490 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
174a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
174b0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
174c0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20  GER_SHARED || . 
174d0 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
174e0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
174f0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
17500 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
17510 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
17520 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
17530 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
17540 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68         /* The sh
17550 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
17560 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
17570 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
17580 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a   file.        **
17590 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
175a0 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20  lready pages in 
175b0 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20  the cache (from 
175c0 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
175d0 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72     ** read or wr
175e0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ite transaction)
175f0 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
17600 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
17610 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62          ** has b
17620 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49  een modified.  I
17630 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
17640 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73  as changed, flus
17650 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  h the.        **
17660 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 20 20   cache..        
17670 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 61  **.        ** Da
17680 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69  tabase changes i
17690 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  s detected by lo
176a0 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
176b0 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
176c0 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
176d0 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
176e0 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
176f0 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
17700 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  s are.        **
17710 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
17720 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
17730 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
17740 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
17750 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
17760 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
17770 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
17780 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
17790 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65         ** a code
177a0 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
177b0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
177c0 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
177d0 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
177e0 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
177f0 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
17800 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65  e .        ** de
17810 74 65 63 68 65 64 2e 20 20 54 68 65 20 63 68 61  teched.  The cha
17820 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
17830 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
17840 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
17850 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
17860 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
17870 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17880 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
17890 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
178a0 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20  bFileVers)];.   
178b0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
178c0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
178d0 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  r);..        if(
178e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
178f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
17900 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
17910 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Code;.        }.
17920 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
17930 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b  ger->dbSize>0 ){
17940 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
17950 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
17960 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
17970 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
17980 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ));.          rc
17990 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
179a0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 32 34 29  (pPager->fd, 24)
179b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
179c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
179d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
179e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
179f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
17a00 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
17a10 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62  (pPager->fd, &db
17a20 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
17a30 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
17a40 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
17a50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17a60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17a70 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
17a80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
17a90 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
17aa0 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
17ab0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
17ac0 73 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  s));.        }..
17ad0 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63          if( memc
17ae0 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  mp(pPager->dbFil
17af0 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
17b00 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
17b10 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20  Vers))!=0 ){.   
17b20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
17b30 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
17b40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17b50 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
17b60 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
17b70 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
17b80 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53 48  >state<=PAGER_SH
17b90 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ARED );.    if( 
17ba0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
17bb0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
17bc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
17bd0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
17be0 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
17bf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17c00 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 50  .** Allocate a P
17c10 67 48 64 72 20 6f 62 6a 65 63 74 2e 20 20 20 45  gHdr object.   E
17c20 69 74 68 65 72 20 63 72 65 61 74 65 20 61 20 6e  ither create a n
17c30 65 77 20 6f 6e 65 20 6f 72 20 72 65 75 73 65 0a  ew one or reuse.
17c40 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f  ** an existing o
17c50 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6f  ne that is not o
17c60 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 2e  therwise in use.
17c70 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50 67 48  .**.** A new PgH
17c80 64 72 20 73 74 72 75 63 74 75 72 65 20 69 73 20  dr structure is 
17c90 63 72 65 61 74 65 64 20 69 66 20 61 6e 79 20 6f  created if any o
17ca0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
17cb0 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a  are.** true:.**.
17cc0 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68  **     (1)  We h
17cd0 61 76 65 20 6e 6f 74 20 65 78 63 65 65 64 65 64  ave not exceeded
17ce0 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   our maximum all
17cf0 6f 63 61 74 65 64 20 63 61 63 68 65 20 73 69 7a  ocated cache siz
17d00 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 73  e.**          as
17d10 20 73 65 74 20 62 79 20 74 68 65 20 22 50 52 41   set by the "PRA
17d20 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 20  GMA cache_size" 
17d30 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
17d40 20 20 20 28 32 29 20 20 54 68 65 72 65 20 61 72     (2)  There ar
17d50 65 20 6e 6f 20 75 6e 75 73 65 64 20 50 67 48 64  e no unused PgHd
17d60 72 20 6f 62 6a 65 63 74 73 20 61 76 61 69 6c 61  r objects availa
17d70 62 6c 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  ble at this time
17d80 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20  ..**.**     (3) 
17d90 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   This is an in-m
17da0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
17db0 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 54  **.**     (4)  T
17dc0 68 65 72 65 20 61 72 65 20 6e 6f 20 50 67 48 64  here are no PgHd
17dd0 72 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 64  r objects that d
17de0 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20  o not require a 
17df0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
17e00 20 20 20 20 66 69 6c 65 20 73 79 6e 63 20 61 6e      file sync an
17e10 64 20 61 20 73 79 6e 63 20 6f 66 20 74 68 65 20  d a sync of the 
17e20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
17e30 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
17e40 20 20 20 20 20 20 70 72 6f 68 69 62 69 74 65 64        prohibited
17e50 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
17e60 65 2c 20 72 65 75 73 65 20 61 6e 20 65 78 69 73  e, reuse an exis
17e70 74 69 6e 67 20 50 67 48 64 72 2e 20 20 49 6e 20  ting PgHdr.  In 
17e80 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 75  other words, reu
17e90 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  se an.** existin
17ea0 67 20 50 67 48 64 72 20 69 66 20 61 6c 6c 20 6f  g PgHdr if all o
17eb0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
17ec0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
17ed0 20 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65      (1)  We have
17ee0 20 72 65 61 63 68 65 64 20 6f 72 20 65 78 63 65   reached or exce
17ef0 65 64 65 64 20 74 68 65 20 6d 61 78 69 6d 75 6d  eded the maximum
17f00 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20   cache size.**  
17f10 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20          allowed 
17f20 62 79 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  by "PRAGMA cache
17f30 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  _size"..**.**   
17f40 20 20 28 32 29 20 20 54 68 65 72 65 20 69 73 20    (2)  There is 
17f50 61 20 50 67 48 64 72 20 61 76 61 69 6c 61 62 6c  a PgHdr availabl
17f60 65 20 77 69 74 68 20 50 67 48 64 72 2d 3e 6e 52  e with PgHdr->nR
17f70 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ef==0.**.**     
17f80 28 33 29 20 20 57 65 20 61 72 65 20 6e 6f 74 20  (3)  We are not 
17f90 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  in an in-memory 
17fa0 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20  database.**.**  
17fb0 20 20 20 28 34 29 20 20 45 69 74 68 65 72 20 74     (4)  Either t
17fc0 68 65 72 65 20 69 73 20 61 6e 20 61 76 61 69 6c  here is an avail
17fd0 61 62 6c 65 20 50 67 48 64 72 20 74 68 61 74 20  able PgHdr that 
17fe0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  does not need.**
17ff0 20 20 20 20 20 20 20 20 20 20 74 6f 20 62 65 20            to be 
18000 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 6f  synced to disk o
18010 72 20 65 6c 73 65 20 64 69 73 6b 20 73 79 6e 63  r else disk sync
18020 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ing is currently
18030 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c  .**          all
18040 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  owed..*/.static 
18050 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63 61 74  int pagerAllocat
18060 65 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  ePage(Pager *pPa
18070 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  ger, PgHdr **ppP
18080 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
18090 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64  QLITE_OK;.  PgHd
180a0 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 43 72  r *pPg;..  /* Cr
180b0 65 61 74 65 20 61 20 6e 65 77 20 50 67 48 64 72  eate a new PgHdr
180c0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
180d0 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 64  our conditions d
180e0 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61 62 6f  efined .  ** abo
180f0 76 65 20 69 73 20 6d 65 74 3a 20 2a 2f 0a 20 20  ve is met: */.  
18100 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
18110 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  e<pPager->mxPage
18120 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  .   || pPager->p
18130 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c 7c 20  First==0 .   || 
18140 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70 50 61  MEMDB.   || (pPa
18150 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
18160 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  d==0 && pPager->
18170 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29 7b 0a  doNotSync).  ){.
18180 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
18190 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e  nPage>=pPager->n
181a0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 70 61  Hash ){.      pa
181b0 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f  ger_resize_hash_
181c0 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20  table(pPager,.  
181d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
181e0 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a  Hash<256 ? 256 :
181f0 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32   pPager->nHash*2
18200 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
18210 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b  ger->nHash==0 ){
18220 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
18230 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
18240 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
18250 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
18260 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
18270 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  Pg = sqliteMallo
18280 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50  cRaw( sizeof(*pP
18290 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67  g) + pPager->pag
182a0 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20  eSize.          
182b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182c0 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20    + sizeof(u32) 
182d0 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
182e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
182f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d               + M
18300 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69  EMDB*sizeof(PgHi
18310 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 69 66  story) );.    if
18320 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
18330 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18340 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
18350 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
18360 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ut;.    }.    me
18370 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a  mset(pPg, 0, siz
18380 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20  eof(*pPg));.    
18390 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
183a0 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
183b0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
183c0 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ger), 0, sizeof(
183d0 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20  PgHistory));.   
183e0 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67   }.    pPg->pPag
183f0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  er = pPager;.   
18400 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d   pPg->pNextAll =
18410 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20   pPager->pAll;. 
18420 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
18430 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 61 67 65  = pPg;.    pPage
18440 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  r->nPage++;.    
18450 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
18460 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61  e>pPager->nMaxPa
18470 67 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ge ){.      asse
18480 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78  rt( pPager->nMax
18490 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e  Page==(pPager->n
184a0 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20  Page-1) );.     
184b0 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67   pPager->nMaxPag
184c0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  e++;.    }.  }el
184d0 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63 79 63  se{.    /* Recyc
184e0 6c 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70  le an existing p
184f0 61 67 65 20 77 69 74 68 20 61 20 7a 65 72 6f 20  age with a zero 
18500 72 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20  ref-count. */.  
18510 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63    rc = pager_rec
18520 79 63 6c 65 28 70 50 61 67 65 72 2c 20 31 2c 20  ycle(pPager, 1, 
18530 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  &pPg);.    if( r
18540 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18550 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
18560 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20  _allocate_out;. 
18570 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
18580 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
18590 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
185a0 20 20 20 61 73 73 65 72 74 28 70 50 67 29 3b 0a     assert(pPg);.
185b0 20 20 7d 0a 20 20 2a 70 70 50 67 20 3d 20 70 50    }.  *ppPg = pP
185c0 67 3b 0a 0a 70 61 67 65 72 5f 61 6c 6c 6f 63 61  g;..pager_alloca
185d0 74 65 5f 6f 75 74 3a 0a 20 20 72 65 74 75 72 6e  te_out:.  return
185e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
185f0 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
18600 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
18610 61 20 70 61 67 65 2e 20 20 49 66 20 74 68 65 20  a page.  If the 
18620 70 61 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76  page was.** prev
18630 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20  iously acquired 
18640 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
18650 31 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74  1, then the cont
18660 65 6e 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20  ent was.** just 
18670 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
18680 65 72 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20  eros instead of 
18690 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
186a0 64 69 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77  disk..** But now
186b0 20 77 65 20 6e 65 65 64 20 74 68 65 20 72 65 61   we need the rea
186c0 6c 20 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69  l data off of di
186d0 73 6b 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72  sk.  So make sur
186e0 65 20 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e  e we.** have it.
186f0 20 20 52 65 61 64 20 69 74 20 69 6e 20 69 66 20    Read it in if 
18700 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69  we do not have i
18710 74 20 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74  t already..*/.st
18720 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67  atic int pager_g
18730 65 74 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72  et_content(PgHdr
18740 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
18750 67 2d 3e 6e 65 65 64 52 65 61 64 20 29 7b 0a 20  g->needRead ){. 
18760 20 20 20 69 6e 74 20 72 63 20 3d 20 72 65 61 64     int rc = read
18770 44 62 50 61 67 65 28 70 50 67 2d 3e 70 50 61 67  DbPage(pPg->pPag
18780 65 72 2c 20 70 50 67 2c 20 70 50 67 2d 3e 70 67  er, pPg, pPg->pg
18790 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  no);.    if( rc=
187a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
187b0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61      pPg->needRea
187c0 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
187d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
187e0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  c;.    }.  }.  r
187f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18800 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
18810 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
18820 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  A read lock on t
18830 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20  he disk file is 
18840 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68  obtained when th
18850 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20  e first page is 
18860 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68  acquired. .** Th
18870 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20  is read lock is 
18880 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65  dropped when the
18890 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
188a0 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leased..**.** Th
188b0 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
188c0 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
188d0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
188e0 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
188f0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
18900 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
18910 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
18920 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
18930 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
18940 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
18950 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
18960 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
18970 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
18980 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
18990 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
189a0 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
189b0 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
189c0 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
189d0 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
189e0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
189f0 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
18a00 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
18a10 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
18a20 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
18a30 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
18a40 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
18a50 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
18a60 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
18a70 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
18a80 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
18a90 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
18aa0 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
18ab0 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
18ac0 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
18ad0 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
18ae0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
18af0 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
18b00 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
18b10 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
18b20 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
18b30 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
18b40 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
18b50 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
18b60 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
18b70 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
18b80 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
18b90 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
18ba0 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
18bb0 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
18bc0 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
18bd0 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
18be0 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
18bf0 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
18c00 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
18c10 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
18c20 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
18c30 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
18c40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
18c50 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
18c60 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
18c70 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
18c80 72 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  re actually read
18c90 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49   from disk..** I
18ca0 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
18cb0 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
18cc0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
18cd0 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
18ce0 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
18cf0 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
18d00 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61  , so do not do a
18d10 20 64 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73   disk read.  Jus
18d20 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a  t fill in the.**
18d30 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69   page content wi
18d40 74 68 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d  th zeros.  But m
18d50 61 72 6b 20 74 68 65 20 66 61 63 74 20 74 68 61  ark the fact tha
18d60 74 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65  t we have not re
18d70 61 64 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ad the.** conten
18d80 74 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  t by setting the
18d90 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
18da0 66 6c 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c  flag.  Later on,
18db0 20 69 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50   if .** sqlite3P
18dc0 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
18dd0 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61  alled on this pa
18de0 67 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  ge or if this ro
18df0 75 74 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c  utine is.** call
18e00 65 64 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f  ed again with no
18e10 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74  Content==0, that
18e20 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
18e30 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65  content is neede
18e40 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73  d.** and the dis
18e50 6b 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  k read should oc
18e60 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
18e70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
18e80 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
18e90 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
18ea0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
18eb0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
18ec0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
18ed0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
18ee0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
18ef0 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
18f00 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
18f10 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
18f20 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
18f30 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
18f40 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
18f50 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
18f60 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74  her reading cont
18f70 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66  ent from disk if
18f80 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67   true */.){.  Pg
18f90 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
18fa0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
18fb0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
18fc0 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50  GER_UNLOCK || pP
18fd0 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20  ager->nRef>0 || 
18fe0 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  pgno==1 );..  /*
18ff0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
19000 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
19010 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
19020 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67  CORRUPT if a pag
19030 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72  e.  ** number gr
19040 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
19050 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71   or zero, is req
19060 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  uested..  */.  i
19070 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41  f( pgno>PAGER_MA
19080 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d  X_PGNO || pgno==
19090 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
190a0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
190b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
190c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
190d0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  PT;.  }..  /* Ma
190e0 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
190f0 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74  not hit any crit
19100 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a  ical errors..  *
19110 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  / .  assert( pPa
19120 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50  ger!=0 );.  *ppP
19130 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  age = 0;.  if( p
19140 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
19150 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
19160 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
19170 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
19180 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
19190 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
191a0 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
191b0 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e  e accessed, then
191c0 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f   get a SHARED lo
191d0 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
191e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61  atabase file. pa
191f0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
19200 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20  is a no-op if . 
19210 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c   ** a database l
19220 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
19230 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eld..  */.  rc =
19240 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
19250 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
19260 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19270 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
19280 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
19290 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
192a0 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ER_UNLOCK );..  
192b0 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
192c0 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
192d0 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ;.  if( pPg==0 )
192e0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
192f0 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
19300 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  ot in the page c
19310 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ache. */.    int
19320 20 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20 68   nMax;.    int h
19330 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
19340 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b  (pPager->nMiss);
19350 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41  .    rc = pagerA
19360 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 50 61 67  llocatePage(pPag
19370 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69  er, &pPg);.    i
19380 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19390 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
193a0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
193b0 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
193c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ;.    assert( !M
193d0 45 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61  EMDB || pgno>pPa
193e0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b  ger->stmtSize );
193f0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
19400 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  >aInJournal && (
19410 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72  int)pgno<=pPager
19420 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
19430 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65        sqlite3Che
19440 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d  ckMemory(pPager-
19450 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >aInJournal, pgn
19460 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65  o/8);.      asse
19470 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
19480 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
19490 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
194a0 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  = (pPager->aInJo
194b0 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20  urnal[pgno/8] & 
194c0 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
194d0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
194e0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
194f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
19500 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
19510 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
19520 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
19530 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
19540 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52  Pg);.    pPg->nR
19550 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49  ef = 1;.    REFI
19560 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20 70  NFO(pPg);..    p
19570 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
19580 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
19590 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20  Extra>0 ){.     
195a0 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
195b0 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
195c0 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  er), 0, pPager->
195d0 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  nExtra);.    }. 
195e0 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65     nMax = sqlite
195f0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
19600 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
19610 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
19620 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19630 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
19640 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61  ;.      rc = pPa
19650 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
19660 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19670 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70     }..    /* Pop
19680 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20 77  ulate the page w
19690 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65 72  ith data, either
196a0 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   by reading from
196b0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
196c0 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79    ** file, or by
196d0 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74   setting the ent
196e0 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f  ire page to zero
196f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19700 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20   nMax<(int)pgno 
19710 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 6e 6f 43  || MEMDB || (noC
19720 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65  ontent && !pPage
19730 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
19740 6b 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  k) ){.      mems
19750 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
19760 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
19770 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
19780 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64     pPg->needRead
19790 20 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20   = noContent && 
197a0 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52  !pPager->alwaysR
197b0 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 49  ollback;.      I
197c0 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
197d0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
197e0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
197f0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  e{.      rc = re
19800 61 64 44 62 50 61 67 65 28 70 50 61 67 65 72 2c  adDbPage(pPager,
19810 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20   pPg, pgno);.   
19820 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19830 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
19840 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
19850 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  EAD ){.        p
19860 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20  Pg->pgno = 0;.  
19870 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
19880 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
19890 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
198a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
198b0 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30  Pg->needRead = 0
198c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
198d0 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e  Link the page in
198e0 74 6f 20 74 68 65 20 70 61 67 65 20 68 61 73 68  to the page hash
198f0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20   table */.    h 
19900 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  = pgno & (pPager
19910 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
19920 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
19930 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
19940 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
19950 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50  aHash[h];.    pP
19960 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
19970 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
19980 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
19990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
199a0 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
199b0 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
199c0 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
199d0 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
199e0 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  pPg;.    }..#ifd
199f0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
19a00 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
19a10 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
19a20 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
19a30 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
19a40 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
19a50 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74  ted page is in t
19a60 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
19a70 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61  /.    assert(pPa
19a80 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70  ger->nRef>0 || p
19a90 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47  gno==1);.    PAG
19aa0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
19ab0 6e 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21  nHit);.    if( !
19ac0 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
19ad0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65     rc = pager_ge
19ae0 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a  t_content(pPg);.
19af0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
19b00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
19b10 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
19b20 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
19b30 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  g);.  }.  *ppPag
19b40 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72  e = pPg;.  retur
19b50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19b60 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
19b70 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
19b80 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
19b90 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
19ba0 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
19bb0 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
19bc0 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
19bd0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
19be0 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
19bf0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
19c00 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ache..**.** See 
19c10 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
19c20 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
19c30 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
19c40 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
19c50 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
19c60 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
19c70 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
19c80 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
19c90 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
19ca0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
19cb0 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
19cc0 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
19cd0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
19ce0 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
19cf0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
19d00 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
19d10 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
19d20 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
19d30 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
19d40 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
19d50 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
19d60 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
19d70 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
19d80 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
19d90 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
19da0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
19db0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
19dc0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
19dd0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c  rt( !pPager->pAl
19de0 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63  l || pPager->exc
19df0 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20  lusiveMode );.  
19e00 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
19e10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
19e20 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
19e30 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
19e40 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
19e50 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67  urn 0;.  }.  pPg
19e60 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
19e70 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
19e80 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65   if( pPg==0 ) re
19e90 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72  turn 0;.  page_r
19ea0 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
19eb0 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
19ec0 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
19ed0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
19ee0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
19ef0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
19f00 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
19f10 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
19f20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
19f30 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
19f40 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
19f50 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
19f60 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
19f70 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
19f80 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
19f90 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
19fa0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
19fb0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
19fc0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a  (DbPage *pPg){..
19fd0 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
19fe0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
19ff0 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  nt for this page
1a000 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1a010 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
1a020 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pPg->nRef--;.  
1a030 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20  REFINFO(pPg);.. 
1a040 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
1a050 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  ;..  /* When the
1a060 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
1a070 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20  ences to a page 
1a080 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68  reach 0, call th
1a090 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f  e.  ** destructo
1a0a0 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61  r and add the pa
1a0b0 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
1a0c0 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
1a0d0 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
1a0e0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
1a0f0 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70  ;.    pPager = p
1a100 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
1a110 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
1a120 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   0;.    pPg->pPr
1a130 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d  evFree = pPager-
1a140 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67  >pLast;.    pPag
1a150 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b  er->pLast = pPg;
1a160 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
1a170 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
1a180 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
1a190 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
1a1a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a1b0 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
1a1c0 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
1a1d0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
1a1e0 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65  Sync==0 && pPage
1a1f0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
1a200 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
1a210 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
1a220 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
1a230 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
1a240 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
1a250 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
1a260 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67  ructor(pPg, pPag
1a270 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1a280 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
1a290 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65  hen all pages re
1a2a0 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  ach the freelist
1a2b0 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20  , drop the read 
1a2c0 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  lock from.    **
1a2d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a2e0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  le..    */.    p
1a2f0 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
1a300 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a310 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20  r->nRef>=0 );.  
1a320 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
1a330 65 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65  ef==0 && (!pPage
1a340 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
1a350 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
1a360 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20  nalOff>0) ){.   
1a370 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
1a380 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
1a390 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1a3a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a3b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1a3c0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
1a3d0 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65  for pPager.  The
1a3e0 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  re should alread
1a3f0 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a  y be a RESERVED.
1a400 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ** or EXCLUSIVE 
1a410 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1a420 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74  base file when t
1a430 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1a440 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
1a450 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
1a460 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65   everything.  Re
1a470 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
1a480 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  de and release t
1a490 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b  he.** write lock
1a4a0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
1a4b0 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
1a4c0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
1a4d0 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
1a4e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1a4f0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
1a500 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
1a510 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1a520 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1a530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1a540 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1a550 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1a560 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
1a570 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
1a580 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1a590 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal==0 );.  sqli
1a5a0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1a5b0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  t(pPager);.  pPa
1a5c0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
1a5d0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1a5e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
1a5f0 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
1a600 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1a610 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
1a620 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1a630 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
1a640 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
1a650 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1a660 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
1a670 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
1a680 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
1a690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6b0 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
1a6c0 6c 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  le);.  assert( r
1a6d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1a6e0 70 50 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20  pPager->jfd );. 
1a6f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a700 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
1a710 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
1a720 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
1a730 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66  nalHdr = 0;.  if
1a740 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a750 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
1a760 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
1a770 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
1a780 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
1a790 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  urnal);.    }.  
1a7a0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
1a7b0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
1a7c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65   }.  sqlite3OsSe
1a7d0 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72  tFullSync(pPager
1a7e0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66  ->jfd, pPager->f
1a7f0 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71  ull_fsync);.  sq
1a800 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79  lite3OsSetFullSy
1a810 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
1a820 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e  Pager->full_fsyn
1a830 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f  c);.  sqlite3OsO
1a840 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61  penDirectory(pPa
1a850 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
1a860 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20  ->zDirectory);. 
1a870 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a880 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67  Open = 1;.  pPag
1a890 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1a8a0 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
1a8b0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1a8c0 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
1a8d0 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Rollback = 0;.  
1a8e0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
1a8f0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1a900 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
1a910 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
1a920 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  ode;.    goto fa
1a930 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
1a940 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  rnal;.  }.  pPag
1a950 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
1a960 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1a970 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
1a980 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
1a990 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1a9a0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
1a9b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a9c0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1a9d0 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e  e3PagerStmtBegin
1a9e0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1a9f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1aa00 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
1aa10 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20  NOMEM ){.    rc 
1aa20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
1aa30 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
1aa40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1aa50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1aa60 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
1aa70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1aa80 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64  turn rc;..failed
1aa90 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
1aaa0 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  :.  sqliteFree(p
1aab0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1aac0 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  l);.  pPager->aI
1aad0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
1aae0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1aaf0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72  .** Acquire a wr
1ab00 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
1ab10 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c  database.  The l
1ab20 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77  ock is removed w
1ab30 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f  hen.** the any o
1ab40 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1ab50 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  happen:.**.**   
1ab60 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  *  sqlite3PagerC
1ab70 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1ab80 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
1ab90 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  *  sqlite3PagerR
1aba0 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c  ollback() is cal
1abb0 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
1abc0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
1abd0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
1abe0 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
1abf0 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  Unref() is calle
1ac00 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
1ac10 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
1ac20 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
1ac30 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
1ac40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70  s routine is a p
1ac50 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70  ointer to any op
1ac60 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  en page of the.*
1ac70 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
1ac80 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65    Nothing change
1ac90 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65  s about the page
1aca0 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65   - it is used me
1acb0 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69  rely to.** acqui
1acc0 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
1acd0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
1ace0 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66  ure and as proof
1acf0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a   that there is.*
1ad00 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  * already a read
1ad10 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
1ad20 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
1ad30 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
1ad40 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  r indicates how 
1ad50 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79  much space in by
1ad60 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66  tes to reserve f
1ad70 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  or a.** master j
1ad80 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65  ournal file-name
1ad90 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
1ada0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65   the journal whe
1adb0 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
1adc0 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
1add0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
1ade0 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
1adf0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
1ae00 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a    For temporary.
1ae10 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ** files, the op
1ae20 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
1ae30 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
1ae40 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
1ae50 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61  e is an.** actua
1ae60 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
1ae70 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
1ae80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
1ae90 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
1aea0 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72   reserved for wr
1aeb0 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74  iting, this rout
1aec0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
1aed0 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20  **.** If exFlag 
1aee0 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61  is true, go ahea
1aef0 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43  d and get an EXC
1af00 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1af10 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64  he file.** immed
1af20 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f  iately instead o
1af30 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20  f waiting until 
1af40 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20  we try to flush 
1af50 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a  the cache.  The.
1af60 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e  ** exFlag is ign
1af70 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61  ored if a transa
1af80 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
1af90 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
1afa0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1afb0 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69  n(DbPage *pPg, i
1afc0 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61  nt exFlag){.  Pa
1afd0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1afe0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
1aff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b000 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1b010 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
1b020 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1b030 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1b040 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1b050 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
1b060 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
1b070 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
1b080 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
1b090 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1b0a0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1b0b0 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
1b0c0 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65  IVE;.      pPage
1b0d0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
1b0e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1b0f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b100 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
1b110 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
1b120 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
1b130 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b140 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b150 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1b160 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
1b170 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  D;.        if( e
1b180 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
1b190 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
1b1a0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
1b1b0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
1b1c0 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
1b1d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1b1e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b1f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1b200 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1b210 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1b220 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ache = 0;.      
1b230 50 41 47 45 52 54 52 41 43 45 32 28 22 54 52 41  PAGERTRACE2("TRA
1b240 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
1b250 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1b260 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
1b270 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26  er->useJournal &
1b280 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
1b290 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
1b2a0 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
1b2b0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1b2c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b2d0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
1b2e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
1b2f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b300 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Off==0 ){.    /*
1b310 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
1b320 65 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73  en the pager was
1b330 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
1b340 63 65 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20  cess mode last. 
1b350 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65     ** time a (re
1b360 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61  ad or write) tra
1b370 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63  nsaction was suc
1b380 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75  cessfully conclu
1b390 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ded.    ** by th
1b3a0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  is connection. I
1b3b0 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69  nstead of deleti
1b3c0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
1b3d0 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20  ile it was .    
1b3e0 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  ** kept open and
1b3f0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20   truncated to 0 
1b400 62 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  bytes..    */.  
1b410 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b420 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  ->nRec==0 );.   
1b430 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b440 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29  >origDbSize==0 )
1b450 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1b460 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1b470 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
1b480 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1b490 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
1b4a0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1b4b0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1b4c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
1b4d0 38 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28  8 + 1 );.    if(
1b4e0 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   !pPager->aInJou
1b4f0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
1b500 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1b510 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b520 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
1b530 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1b540 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20  bSize;.      rc 
1b550 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
1b560 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
1b570 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
1b580 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b590 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  pen || pPager->j
1b5a0 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72  ournalOff>0 || r
1b5b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1b5c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b5d0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67  /*.** Make a pag
1b5e0 65 20 64 69 72 74 79 2e 20 20 53 65 74 20 69 74  e dirty.  Set it
1b5f0 73 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64  s dirty flag and
1b600 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 64   add it to the d
1b610 69 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73  irty.** page lis
1b620 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1b630 64 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64  d makeDirty(PgHd
1b640 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
1b650 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a  Pg->dirty==0 ){.
1b660 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
1b670 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1b680 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
1b690 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44  = 1;.    pPg->pD
1b6a0 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70  irty = pPager->p
1b6b0 44 69 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70  Dirty;.    if( p
1b6c0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b  Pager->pDirty ){
1b6d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
1b6e0 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
1b6f0 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  y = pPg;.    }. 
1b700 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72     pPg->pPrevDir
1b710 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ty = 0;.    pPag
1b720 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  er->pDirty = pPg
1b730 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
1b740 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e  ake a page clean
1b750 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64 69 72  .  Clear its dir
1b760 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76  ty bit and remov
1b770 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  e it from the.**
1b780 20 64 69 72 74 79 20 70 61 67 65 20 6c 69 73 74   dirty page list
1b790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b7a0 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72   makeClean(PgHdr
1b7b0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
1b7c0 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
1b7d0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
1b7e0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69      if( pPg->pDi
1b7f0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67  rty ){.      pPg
1b800 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44  ->pDirty->pPrevD
1b810 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 50 72 65  irty = pPg->pPre
1b820 76 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  vDirty;.    }.  
1b830 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
1b840 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70  Dirty ){.      p
1b850 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e  Pg->pPrevDirty->
1b860 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44  pDirty = pPg->pD
1b870 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  irty;.    }else{
1b880 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
1b890 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  er->pDirty = pPg
1b8a0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
1b8b0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61    }.}.../*.** Ma
1b8c0 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
1b8d0 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68  s writeable.  Th
1b8e0 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
1b8f0 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
1b900 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  al .** if it is 
1b910 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
1b920 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
1b930 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
1b940 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a  before making.**
1b950 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
1b960 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
1b970 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
1b980 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
1b990 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74   the pager creat
1b9a0 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72  es a new.** jour
1b9b0 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73  nal and acquires
1b9c0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
1b9d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1b9e0 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56  .  If the RESERV
1b9f0 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64  ED.** lock could
1ba00 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64   not be acquired
1ba10 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
1ba20 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
1ba30 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  SY.  The.** call
1ba40 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  ing routine must
1ba50 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20   check for that 
1ba60 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64  return value and
1ba70 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
1ba80 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79  to.** change any
1ba90 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c   page data until
1baa0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1bab0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1bac0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
1bad0 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64  urnal file could
1bae0 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
1baf0 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b  because the disk
1bb00 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65   is full,.** the
1bb10 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
1bb20 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55  eturns SQLITE_FU
1bb30 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69  LL and does an i
1bb40 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63  mmediate rollbac
1bb50 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71  k..** All subseq
1bb60 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d  uent write attem
1bb70 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20  pts also return 
1bb80 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69  SQLITE_FULL unti
1bb90 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20  l there.** is a 
1bba0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
1bbb0 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20  agerCommit() or 
1bbc0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1bbd0 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73  back() to.** res
1bbe0 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
1bbf0 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
1bc00 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69  Hdr *pPg){.  voi
1bc10 64 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52  d *pData = PGHDR
1bc20 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
1bc30 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1bc40 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1bc50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1bc60 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
1bc70 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
1bc80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1bc90 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65  rCode ){ .    re
1bca0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1bcb0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
1bcc0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
1bcd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1bce0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
1bcf0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
1bd00 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
1bd10 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
1bd20 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
1bd30 69 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76  is page was prev
1bd40 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20  iously acquired 
1bd50 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
1bd60 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20  1, that means.  
1bd70 2a 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61  ** we didn't rea
1bd80 6c 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20  lly read in the 
1bd90 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
1bda0 61 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68  age.  This can h
1bdb0 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20  appen.  ** (for 
1bdc0 65 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68  example) when th
1bdd0 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
1bde0 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
1bdf0 65 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a  elist.  But.  **
1be00 20 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72   now we are (per
1be10 68 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65  haps) moving the
1be20 20 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65   page off of the
1be30 20 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20   freelist for.  
1be40 2a 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20  ** reuse and we 
1be50 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73  need to know its
1be60 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
1be70 74 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e  t so that conten
1be80 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74  t.  ** can be st
1be90 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ored in the roll
1bea0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53  back journal.  S
1beb0 6f 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74  o do the read at
1bec0 20 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e   this.  ** time.
1bed0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
1bee0 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
1bef0 50 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  Pg);.  if( rc ){
1bf00 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1bf10 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
1bf20 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
1bf30 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
1bf40 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1bf50 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
1bf60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
1bf70 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
1bf80 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
1bf90 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29    makeDirty(pPg)
1bfa0 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
1bfb0 6f 75 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49  ournal && (pageI
1bfc0 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20  nStatement(pPg) 
1bfd0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  || pPager->stmtI
1bfe0 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nUse==0) ){.    
1bff0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1c000 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  he = 1;.  }else{
1c010 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67  ..    /* If we g
1c020 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
1c030 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
1c040 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
1c050 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74      ** written t
1c060 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
1c070 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
1c080 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
1c090 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  nal.    ** or bo
1c0a0 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  th..    **.    *
1c0b0 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f  * First check to
1c0c0 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72   see that the tr
1c0d0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1c0e0 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20  l exists and.   
1c0f0 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66   ** create it if
1c100 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20   it does not..  
1c110 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1c120 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1c130 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
1c140 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c150 50 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20  PagerBegin(pPg, 
1c160 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
1c170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c180 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c190 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1c1a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c1b0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1c1c0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1c1d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
1c1e0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
1c1f0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
1c200 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
1c210 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1c220 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c230 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1c240 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
1c250 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1c260 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61  rnalOpen || !pPa
1c270 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1c280 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
1c290 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
1c2a0 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
1c2b0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1c2c0 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
1c2d0 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
1c2e0 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
1c2f0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1c300 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
1c310 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
1c320 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1c330 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
1c340 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1c350 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
1c360 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
1c370 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
1c380 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
1c390 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  & (pPager->useJo
1c3a0 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20  urnal || MEMDB) 
1c3b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e  ){.      if( (in
1c3c0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
1c3d0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1c3e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
1c3f0 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 69   szPg;.        i
1c400 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1c410 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1c420 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1c430 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1c440 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50  er);.          P
1c450 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52  AGERTRACE3("JOUR
1c460 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1c470 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1c480 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
1c490 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1c4a0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d  ( pHist->pOrig==
1c4b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
1c4c0 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
1c4d0 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
1c4e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1c4f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1c500 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
1c510 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1c520 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  cpy(pHist->pOrig
1c530 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1c540 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
1c550 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
1c560 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1c570 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33  se{.          u3
1c580 32 20 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a  2 cksum, saved;.
1c590 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1c5a0 70 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20  pData2, *pEnd;. 
1c5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73           /* We s
1c5c0 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
1c5d0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1c5e0 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
1c5f0 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1c600 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
1c610 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
1c620 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1c630 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
1c640 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
1c650 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
1c660 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1c670 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
1c680 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
1c690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61  );.          pDa
1c6a0 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
1c6b0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
1c6c0 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
1c6d0 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
1c6e0 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
1c6f0 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
1c700 20 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20           pEnd = 
1c710 70 44 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d  pData2 + pPager-
1c720 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
1c730 20 20 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34       pData2 -= 4
1c740 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ;.          save
1c750 64 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b  d = *(u32*)pEnd;
1c760 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33 32  .          put32
1c770 62 69 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d  bits(pEnd, cksum
1c780 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  );.          szP
1c790 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g = pPager->page
1c7a0 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20  Size+8;.        
1c7b0 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74    put32bits(pDat
1c7c0 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  a2, pPg->pgno);.
1c7d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1c7e0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1c7f0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
1c800 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20  2, szPg);.      
1c810 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f      IOTRACE(("JO
1c820 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64  UT %p %d %lld %d
1c830 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1c840 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
1c850 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1c860 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73  r->journalOff, s
1c870 7a 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20  zPg));.         
1c880 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1c890 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
1c8a0 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
1c8b0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1c8c0 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20  alOff += szPg;. 
1c8d0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
1c8e0 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE4("JOURNAL %d
1c8f0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
1c900 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
1c910 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1c920 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1c930 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
1c940 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
1c950 20 2a 28 75 33 32 2a 29 70 45 6e 64 20 3d 20 73   *(u32*)pEnd = s
1c960 61 76 65 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20  aved;...  /* An 
1c970 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
1c980 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  d writing to the
1c990 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
1c9a0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  he .          **
1c9b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
1c9c0 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
1c9d0 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
1c9e0 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ove..          *
1c9f0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
1ca00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ca10 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1ca20 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1ca30 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70    }..          p
1ca40 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
1ca50 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1ca60 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1ca70 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
1ca80 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
1ca90 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
1caa0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1cab0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
1cac0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
1cad0 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
1cae0 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  nc;.          if
1caf0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1cb00 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Use ){.         
1cb10 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1cb20 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
1cb30 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1cb40 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  &7);.          }
1cb50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cb60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cb70 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1cb80 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1cb90 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
1cba0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
1cbb0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28      PAGERTRACE4(
1cbc0 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
1cbd0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
1cbe0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1cbf0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1cc00 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1cc10 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
1cc20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1cc30 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
1cc40 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1cc50 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1cc60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1cc70 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1cc80 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
1cc90 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
1cca0 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
1ccb0 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
1ccc0 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
1ccd0 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
1cce0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
1ccf0 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
1cd00 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
1cd10 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
1cd20 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1cd30 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
1cd40 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
1cd50 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
1cd60 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
1cd70 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
1cd80 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
1cd90 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
1cda0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1cdb0 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20  stmtInUse .     
1cdc0 26 26 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d  && !pageInStatem
1cdd0 65 6e 74 28 70 50 67 29 20 0a 20 20 20 20 20 26  ent(pPg) .     &
1cde0 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
1cdf0 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
1ce00 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze .    ){.     
1ce10 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1ce20 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
1ce30 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1ce40 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
1ce50 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
1ce60 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
1ce70 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1ce80 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1ce90 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1cea0 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
1ceb0 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  >pStmt==0 );.   
1cec0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
1ced0 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
1cee0 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67  Raw( pPager->pag
1cef0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
1cf00 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
1cf10 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
1cf20 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74  emcpy(pHist->pSt
1cf30 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  mt, PGHDR_TO_DAT
1cf40 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
1cf50 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1cf60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47     }.        PAG
1cf70 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a  ERTRACE3("STMT-J
1cf80 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1cf90 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1cfa0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1cfb0 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f  );.        page_
1cfc0 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
1cfd0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  (pPg);.      }el
1cfe0 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  se{.        char
1cff0 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43   *pData2 = CODEC
1d000 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
1d010 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34   pPg->pgno, 7)-4
1d020 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62  ;.        put32b
1d030 69 74 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d  its(pData2, pPg-
1d040 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1d050 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1d060 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ite(pPager->stfd
1d070 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
1d080 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20  ->pageSize+4);. 
1d090 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1d0a0 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
1d0b0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1d0c0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1d0d0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1d0e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d0f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d100 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d110 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d120 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
1d130 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
1d140 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1d150 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt!=0 );.     
1d160 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1d170 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
1d180 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1d190 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  &7);.      }.   
1d1a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
1d1b0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
1d1c0 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
1d1d0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1d1e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1d1f0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
1d200 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
1d210 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70  Size<(int)pPg->p
1d220 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
1d230 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
1d240 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21  >pgno;.    if( !
1d250 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
1d260 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47  >dbSize==PENDING
1d270 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
1d280 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
1d290 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b  pPager->dbSize++
1d2a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1d2b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d2c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1d2d0 69 73 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20  is used to mark 
1d2e0 61 20 64 61 74 61 2d 70 61 67 65 20 61 73 20 77  a data-page as w
1d2f0 72 69 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73  ritable. It uses
1d300 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65   .** pager_write
1d310 28 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75  () to open a jou
1d320 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74  rnal file (if it
1d330 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1d340 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69  open).** and wri
1d350 74 65 20 74 68 65 20 70 61 67 65 20 2a 70 44 61  te the page *pDa
1d360 74 61 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ta to the journa
1d370 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  l..**.** The dif
1d380 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1d390 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
1d3a0 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  d pager_write() 
1d3b0 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
1d3c0 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65  function also de
1d3d0 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65  als with the spe
1d3e0 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20  cial case where 
1d3f0 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a  2 or more pages.
1d400 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67  ** fit on a sing
1d410 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
1d420 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
1d430 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67   co-resident pag
1d440 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20  es.** must have 
1d450 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1d460 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1d470 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1d480 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
1d490 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61  3PagerWrite(DbPa
1d4a0 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
1d4b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1d4c0 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50  OK;..  PgHdr *pP
1d4d0 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50  g = pDbPage;.  P
1d4e0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1d4f0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67  Pg->pPager;.  Pg
1d500 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  no nPagePerSecto
1d510 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63  r = (pPager->sec
1d520 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e  torSize/pPager->
1d530 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66  pageSize);..  if
1d540 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67  ( !MEMDB && nPag
1d550 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
1d560 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
1d570 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
1d580 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1d590 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
1d5a0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
1d5b0 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
1d5c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1d5d0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
1d5e0 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
1d5f0 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
1d600 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
1d610 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d620 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
1d630 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
1d640 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
1d650 74 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  t ii;..    /* Se
1d660 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20  t the doNotSync 
1d670 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20  flag to 1. This 
1d680 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61  is because we ca
1d690 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75  nnot allow a jou
1d6a0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64  rnal.    ** head
1d6b0 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  er to be written
1d6c0 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67   between the pag
1d6d0 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20  es journaled by 
1d6e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  this function.. 
1d6f0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1d700 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
1d710 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ync==0 );.    pP
1d720 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
1d730 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  = 1;..    /* Thi
1d740 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20  s trick assumes 
1d750 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61  that both the pa
1d760 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
1d770 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20  or-size are.    
1d780 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f  ** an integer po
1d790 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74  wer of 2. It set
1d7a0 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74  s variable pg1 t
1d7b0 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  o the identifier
1d7c0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  .    ** of the f
1d7d0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1d7e0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
1d7f0 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a  ocated on..    *
1d800 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50  /.    pg1 = ((pP
1d810 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e  g->pgno-1) & ~(n
1d820 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
1d830 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67  ) + 1;..    nPag
1d840 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33  eCount = sqlite3
1d850 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1d860 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1d870 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43  pPg->pgno>nPageC
1d880 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
1d890 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f  age = (pPg->pgno
1d8a0 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d   - pg1)+1;.    }
1d8b0 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50  else if( (pg1+nP
1d8c0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e  agePerSector-1)>
1d8d0 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
1d8e0 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
1d8f0 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20  eCount+1-pg1;.  
1d900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
1d910 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53  Page = nPagePerS
1d920 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  ector;.    }.   
1d930 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29   assert(nPage>0)
1d940 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31  ;.    assert(pg1
1d950 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  <=pPg->pgno);.  
1d960 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50    assert((pg1+nP
1d970 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b  age)>pPg->pgno);
1d980 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
1d990 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d  ii<nPage && rc==
1d9a0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29  SQLITE_OK; ii++)
1d9b0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20  {.      Pgno pg 
1d9c0 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20  = pg1+ii;.      
1d9d0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e  if( !pPager->aIn
1d9e0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70  Journal || pg==p
1d9f0 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20  Pg->pgno || .   
1da00 20 20 20 20 20 20 20 70 67 3e 70 50 61 67 65 72         pg>pPager
1da10 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c 20  ->origDbSize || 
1da20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  !(pPager->aInJou
1da30 72 6e 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28  rnal[pg/8]&(1<<(
1da40 70 67 26 37 29 29 29 0a 20 20 20 20 20 20 29 20  pg&7))).      ) 
1da50 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
1da60 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
1da70 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1da80 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
1da90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
1daa0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1dab0 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
1dac0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1dad0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dae0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1daf0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
1db00 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
1db10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1db20 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
1db30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1db40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1db50 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
1db60 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
1db70 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50  ync==1 );.    pP
1db80 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
1db90 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1dba0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
1dbb0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  te(pDbPage);.  }
1dbc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dbd0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
1dbe0 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
1dbf0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
1dc00 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
1dc10 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
1dc20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1dc30 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
1dc40 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
1dc50 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
1dc60 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
1dc70 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
1dc80 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  age..*/.#ifndef 
1dc90 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  NDEBUG.int sqlit
1dca0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
1dcb0 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  le(DbPage *pPg){
1dcc0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64  .  return pPg->d
1dcd0 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  irty;.}.#endif..
1dce0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1dcf0 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  MIT_VACUUM./*.**
1dd00 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e   Replace the con
1dd10 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65  tent of a single
1dd20 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69   page with the i
1dd30 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
1dd40 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d  e third.** argum
1dd50 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
1dd60 74 65 33 50 61 67 65 72 4f 76 65 72 77 72 69 74  te3PagerOverwrit
1dd70 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1dd80 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64   Pgno pgno, void
1dd90 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
1dda0 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
1ddb0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1ddc0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
1ddd0 2c 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20  , pgno, &pPg);. 
1dde0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ddf0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1de00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1de10 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
1de20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1de30 20 20 20 20 20 20 6d 65 6d 63 70 79 28 73 71 6c        memcpy(sql
1de40 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
1de50 28 70 50 67 29 2c 20 70 44 61 74 61 2c 20 70 50  (pPg), pData, pP
1de60 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1de70 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1de80 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1de90 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1dea0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
1deb0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1dec0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1ded0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1dee0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1def0 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
1df00 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1df10 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
1df20 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
1df30 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
1df40 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
1df50 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
1df60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
1df70 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
1df80 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
1df90 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
1dfa0 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
1dfb0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
1dfc0 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65   is unused.  The
1dfd0 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
1dfe0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
1dff0 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
1e000 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
1e010 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
1e020 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
1e030 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
1e040 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74  on, together wit
1e050 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  h the.** sqlite3
1e060 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1e070 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20  k() below, more 
1e080 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20  than double the 
1e090 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67  speed.** of larg
1e0a0 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69  e INSERT operati
1e0b0 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c  ons and quadrupl
1e0c0 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
1e0d0 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a  arge DELETEs..**
1e0e0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
1e0f0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
1e100 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52   set the alwaysR
1e110 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20  ollback flag to 
1e120 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75  true..** Subsequ
1e130 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
1e140 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1e150 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20  lback() for the 
1e160 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c  same page.** wil
1e170 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20  l thereafter be 
1e180 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
1e190 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61  s necessary to a
1e1a0 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a  void a problem.*
1e1b0 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77  * where a page w
1e1c0 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65  ith data is adde
1e1d0 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1e1e0 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72  t during one par
1e1f0 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61  t of.** a transa
1e200 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76  ction then remov
1e210 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
1e220 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61  list during a la
1e230 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  ter part.** of t
1e240 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74  he same transact
1e250 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66  ion and reused f
1e260 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
1e270 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a  rpose.  When it.
1e280 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65  ** is first adde
1e290 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1e2a0 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
1e2b0 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e  is called.  When
1e2c0 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20   reused,.** the 
1e2d0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1e2e0 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69  Rollback() routi
1e2f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42  ne is called.  B
1e300 75 74 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ut because the.*
1e310 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  * page contains 
1e320 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77  critical data, w
1e330 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
1e340 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73 0a  be sure it gets.
1e350 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  ** rolled back i
1e360 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73  n spite of the s
1e370 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1e380 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a  ollback() call..
1e390 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
1e3a0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62  agerDontWrite(Db
1e3b0 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
1e3c0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
1e3d0 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
1e3e0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1e3f0 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45  Pager;..  if( ME
1e400 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  MDB ) return;.  
1e410 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
1e420 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  ack = 1;.  if( p
1e430 50 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50  Pg->dirty && !pP
1e440 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1e450 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1e460 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1e470 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
1e480 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
1e490 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e  Size==(int)pPg->
1e4a0 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e  pgno && pPager->
1e4b0 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65  origDbSize<pPage
1e4c0 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
1e4d0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61     /* If this pa
1e4e0 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20  ges is the last 
1e4f0 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
1e500 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
1e510 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a  s grown.      **
1e520 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
1e530 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
1e540 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72   then do NOT mar
1e550 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  k the page as cl
1e560 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68  ean..      ** Wh
1e570 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
1e580 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d  file grows, we m
1e590 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ust make sure th
1e5a0 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
1e5b0 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77  .      ** gets w
1e5c0 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20  ritten at least 
1e5d0 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65  once so that the
1e5e0 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20   disk file will 
1e5f0 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  be the correct. 
1e600 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66       ** size. If
1e610 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74   you do not writ
1e620 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20  e this page and 
1e630 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1e640 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  file.      ** on
1e650 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75   the disk ends u
1e660 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c  p being too smal
1e670 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64  l, that can lead
1e680 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20   to database.   
1e690 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e     ** corruption
1e6a0 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74   during the next
1e6b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
1e6c0 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65      */.    }else
1e6d0 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
1e6e0 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE3("DONT_WRITE 
1e6f0 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
1e700 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
1e710 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1e720 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
1e730 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
1e740 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1e750 29 29 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  )).      makeCle
1e760 61 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20  an(pPg);.#ifdef 
1e770 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1e780 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  ES.      pPg->pa
1e790 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
1e7a0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
1e7b0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ndif.    }.  }.}
1e7c0 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
1e7d0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
1e7e0 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
1e7f0 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63  hat if a rollbac
1e800 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20  k occurs,.** it 
1e810 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
1e820 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
1e830 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65  data on the give
1e840 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a  n page.  This.**
1e850 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1e860 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68  pager does not h
1e870 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68  ave to record th
1e880 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20  e given page in 
1e890 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  the.** rollback 
1e8a0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
1e8b0 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65  f we have not ye
1e8c0 74 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  t actually read 
1e8d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
1e8e0 68 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20  his page (if.** 
1e8f0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65  the PgHdr.needRe
1e900 61 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 20  ad flag is set) 
1e910 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
1e920 65 20 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d  e acts as a prom
1e930 69 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77  ise.** that we w
1e940 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74  ill never need t
1e950 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  o read the page 
1e960 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66  content in the f
1e970 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65  uture..** so the
1e980 20 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 63   needRead flag c
1e990 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61 74  an be cleared at
1e9a0 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   this point..*/.
1e9b0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1e9c0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62  rDontRollback(Db
1e9d0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
1e9e0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1e9f0 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61 73  g->pPager;..  as
1ea00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1ea10 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1ea20 56 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61  VED );.  if( pPa
1ea30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1ea40 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1ea50 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  if( pPg->alwaysR
1ea60 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65  ollback || pPage
1ea70 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
1ea80 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74  k || MEMDB ) ret
1ea90 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d  urn;.  if( !pPg-
1eaa0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  >inJournal && (i
1eab0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
1eac0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1ead0 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
1eae0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
1eaf0 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70  rnal!=0 );.    p
1eb00 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1eb10 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  l[pPg->pgno/8] |
1eb20 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1eb30 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a  7);.    pPg->inJ
1eb40 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
1eb50 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
1eb60 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
1eb70 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1eb80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
1eb90 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1eba0 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1ebb0 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20 20  gno&7);.    }.  
1ebc0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44    PAGERTRACE3("D
1ebd0 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67  ONT_ROLLBACK pag
1ebe0 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
1ebf0 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
1ec00 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1ec10 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41 47  IOTRACE(("GARBAG
1ec20 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  E %p %d\n", pPag
1ec30 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
1ec40 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1ec50 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20  ->stmtInUse .   
1ec60 26 26 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d  && !pageInStatem
1ec70 65 6e 74 28 70 50 67 29 20 0a 20 20 20 26 26 20  ent(pPg) .   && 
1ec80 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
1ec90 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1eca0 20 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72   .  ){.    asser
1ecb0 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
1ecc0 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
1ecd0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
1ece0 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  DbSize );.    as
1ecf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1ed00 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
1ed10 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1ed20 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1ed30 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1ed40 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
1ed50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1ed60 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
1ed70 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  ent the database
1ed80 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
1ed90 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20  nter,.** stored 
1eda0 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68  at byte 24 of th
1edb0 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f  e pager file..*/
1edc0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1edd0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1ede0 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
1edf0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
1ee00 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e  gHdr;.  u32 chan
1ee10 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e  ge_counter;.  in
1ee20 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50  t rc;..  if( !pP
1ee30 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1ee40 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20  tDone ){.    /* 
1ee50 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74  Open page 1 of t
1ee60 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74  he file for writ
1ee70 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ing. */.    rc =
1ee80 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1ee90 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67  (pPager, 1, &pPg
1eea0 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Hdr);.    if( rc
1eeb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1eec0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
1eed0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1eee0 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20  ite(pPgHdr);.   
1eef0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ef00 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1ef10 20 20 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74    .    /* Read t
1ef20 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1ef30 20 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   at byte 24. */.
1ef40 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
1ef50 65 72 20 3d 20 72 65 74 72 69 65 76 65 33 32 62  er = retrieve32b
1ef60 69 74 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b  its(pPgHdr, 24);
1ef70 0a 20 20 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65  .  .    /* Incre
1ef80 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
1ef90 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
1efa0 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
1efb0 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
1efc0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ange_counter++;.
1efd0 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28      put32bits(((
1efe0 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44  char*)PGHDR_TO_D
1eff0 41 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c  ATA(pPgHdr))+24,
1f000 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1f010 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65  ;.  .    /* Rele
1f020 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
1f030 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73  erence. */.    s
1f040 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1f050 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50  (pPgHdr);.    pP
1f060 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1f070 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20  tDone = 1;.  }. 
1f080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f090 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
1f0a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f0b0 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
1f0c0 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
1f0d0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
1f0e0 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
1f0f0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1f100 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
1f110 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1f120 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
1f130 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
1f140 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
1f150 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
1f160 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
1f170 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
1f180 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
1f190 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
1f1a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f1b0 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  e ensures that t
1f1c0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
1f1d0 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20  nced, all dirty 
1f1e0 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a  pages written.**
1f1f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1f200 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61   file and the da
1f210 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63  tabase file sync
1f220 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  ed. The only thi
1f230 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69  ng that.** remai
1f240 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
1f250 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1f260 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
1f270 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a  urnal file (or.*
1f280 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
1f290 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
1f2a0 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
1f2b0 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
1f2c0 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
1f2d0 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
1f2e0 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
1f2f0 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
1f300 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1f310 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
1f320 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  l..**.** If para
1f330 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20  meter nTrunc is 
1f340 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
1f350 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73  he pager file is
1f360 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a   truncated to.**
1f370 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28 74   nTrunc pages (t
1f380 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 61  his is used by a
1f390 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1f3a0 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ases)..*/.int sq
1f3b0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1f3c0 50 68 61 73 65 4f 6e 65 28 50 61 67 65 72 20 2a  PhaseOne(Pager *
1f3d0 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
1f3e0 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e  ar *zMaster, Pgn
1f3f0 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74  o nTrunc){.  int
1f400 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f410 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28  ..  PAGERTRACE4(
1f420 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
1f430 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
1f440 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c  %s nTrunc=%d\n",
1f450 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
1f460 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74  zFilename, zMast
1f470 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20  er, nTrunc);..  
1f480 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
1f490 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
1f4a0 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
1f4b0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
1f4c0 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   or this.  ** fu
1f4d0 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  nction has alrea
1f4e0 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  dy been called, 
1f4f0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  it is a no-op.. 
1f500 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
1f510 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53  ->state!=PAGER_S
1f520 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20  YNCED && !MEMDB 
1f530 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  && pPager->dirty
1f540 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48  Cache ){.    PgH
1f550 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73  dr *pPg;.    ass
1f560 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1f570 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20  rnalOpen );..   
1f580 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   /* If a master 
1f590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
1f5a0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
1f5b0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1f5c0 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
1f5d0 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73   file, then no s
1f5e0 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e  ync is required.
1f5f0 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
1f600 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20  en it is.    ** 
1f610 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68  written, then th
1f620 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20  e process fails 
1f630 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
1f640 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e  a RESERVED to an
1f650 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
1f660 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74  E lock. The next
1f670 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73   time the proces
1f680 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69  s tries to commi
1f690 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
1f6a0 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a  nsaction the m-j
1f6b0 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20   name will have 
1f6c0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1f6d0 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
1f6e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65   if( !pPager->se
1f6f0 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20  tMaster ){.     
1f700 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
1f710 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
1f720 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1f730 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f740 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1f750 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1f760 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1f770 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e  .      if( nTrun
1f780 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
1f790 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73  /* If this trans
1f7a0 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20  action has made 
1f7b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61  the database sma
1f7c0 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70  ller, then all p
1f7d0 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ages.        ** 
1f7e0 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20  being discarded 
1f7f0 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  by the truncatio
1f800 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  n must be writte
1f810 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
1f820 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
1f830 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1f840 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20       Pgno i;.   
1f850 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d       int iSkip =
1f860 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
1f870 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1f880 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b  for( i=nTrunc+1;
1f890 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67   i<=pPager->orig
1f8a0 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20  DbSize; i++ ){. 
1f8b0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
1f8c0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1f8d0 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26  l[i/8] & (1<<(i&
1f8e0 37 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70  7))) && i!=iSkip
1f8f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f900 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f910 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
1f920 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  &pPg);.         
1f930 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f940 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1f950 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
1f960 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f970 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a  agerWrite(pPg);.
1f980 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1f990 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1f9a0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
1f9b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f9c0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1f9d0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  it;.          }.
1f9e0 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
1f9f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1fa00 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72  rc = writeMaster
1fa10 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
1fa20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
1fa30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fa40 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1fa50 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  it;.      rc = s
1fa60 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
1fa70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1fa80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1fa90 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1faa0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
1fab0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1fac0 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75  UUM.    if( nTru
1fad0 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  nc!=0 ){.      r
1fae0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1faf0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  Truncate(pPager,
1fb00 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20   nTrunc);.      
1fb10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fb20 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1fb30 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  it;.    }.#endif
1fb40 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
1fb50 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
1fb60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1fb70 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  ile */.    pPg =
1fb80 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
1fb90 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
1fba0 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  r);.    rc = pag
1fbb0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
1fbc0 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  t(pPg);.    if( 
1fbd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1fbe0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1fbf0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
1fc00 74 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ty = 0;..    /* 
1fc10 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
1fc20 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
1fc30 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
1fc40 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
1fc50 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1fc60 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20  Pager->fd, 0);. 
1fc70 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45     }.    IOTRACE
1fc80 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c  (("DBSYNC %p\n",
1fc90 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70   pPager))..    p
1fca0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1fcb0 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
1fcc0 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26  else if( MEMDB &
1fcd0 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  & nTrunc!=0 ){. 
1fce0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1fcf0 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61  agerTruncate(pPa
1fd00 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ger, nTrunc);.  
1fd10 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20  }..sync_exit:.  
1fd20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1fd30 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20  *.** Commit all 
1fd40 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
1fd50 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65  atabase and rele
1fd60 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
1fd70 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1fd80 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f   commit fails fo
1fd90 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20  r any reason, a 
1fda0 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74  rollback attempt
1fdb0 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20   is made.** and 
1fdc0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1fdd0 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74   returned.  If t
1fde0 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64  he commit worked
1fdf0 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  , SQLITE_OK.** i
1fe00 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
1fe10 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
1fe20 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61  ommitPhaseTwo(Pa
1fe30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1fe40 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
1fe50 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61  *pPg;..  if( pPa
1fe60 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
1fe70 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
1fe80 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
1fe90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1fea0 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
1feb0 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
1fec0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1fed0 20 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45 32   }.  PAGERTRACE2
1fee0 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  ("COMMIT %d\n", 
1fef0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1ff00 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
1ff10 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
1ff20 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
1ff30 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
1ff40 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a    while( pPg ){.
1ff50 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1ff60 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1ff70 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1ff80 65 72 29 3b 0a 20 20 20 20 20 20 63 6c 65 61 72  er);.      clear
1ff90 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
1ffa0 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
1ffb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1ffc0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
1ffd0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53        pHist->inS
1ffe0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
1fff0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
20000 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70  ;.      pHist->p
20010 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
20020 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
20030 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67  .      pPg = pPg
20040 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
20050 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
20060 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ty = 0;.#ifndef 
20070 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70  NDEBUG.    for(p
20080 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
20090 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
200a0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
200b0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
200c0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
200d0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
200e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
200f0 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
20100 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
20110 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
20120 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
20130 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
20140 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
20150 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
20160 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
20170 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
20180 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
20190 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
201a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
201b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
201c0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72   || !pPager->dir
201d0 74 79 43 61 63 68 65 20 29 3b 0a 20 20 61 73 73  tyCache );.  ass
201e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
201f0 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
20200 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72   || !pPager->dir
20210 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20  tyCache );.  rc 
20220 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
20230 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
20240 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
20250 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
20260 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
20270 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
20280 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
20290 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
202a0 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
202b0 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  .** All in-memor
202c0 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65  y cache pages re
202d0 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72  vert to their or
202e0 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74  iginal data cont
202f0 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75  ents..** The jou
20300 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e  rnal is deleted.
20310 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
20320 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ine cannot fail 
20330 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
20340 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74  r process is not
20350 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
20360 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e  e correct lockin
20370 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e  g protocol or un
20380 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a  less some other.
20390 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72  ** process is wr
203a0 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f  iting trash into
203b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
203c0 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e (SQLITE_CORRUP
203d0 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20  T) or.** unless 
203e0 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29  a prior malloc()
203f0 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f   failed (SQLITE_
20400 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72  NOMEM).  Appropr
20410 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  iate error.** co
20420 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  des are returned
20430 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f   for all these o
20440 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72  ccasions.  Other
20450 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
20460 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
20470 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
20480 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  gerRollback(Page
20490 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
204a0 74 20 72 63 3b 0a 20 20 50 41 47 45 52 54 52 41  t rc;.  PAGERTRA
204b0 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE2("ROLLBACK %d
204c0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
204d0 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
204e0 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  DB ){.    PgHdr 
204f0 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50  *p;.    for(p=pP
20500 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
20510 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
20520 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
20530 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73  pHist;.      ass
20540 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52  ert( !p->alwaysR
20550 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
20560 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29   if( !p->dirty )
20570 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
20580 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
20590 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
205a0 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69  , pPager))->pOri
205b0 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  g );.        ass
205c0 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72  ert( !((PgHistor
205d0 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53  y *)PGHDR_TO_HIS
205e0 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70  T(p, pPager))->p
205f0 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Stmt );.        
20600 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20610 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d  }..      pHist =
20620 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
20630 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
20640 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
20650 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  g ){.        mem
20660 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
20670 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72  A(p), pHist->pOr
20680 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ig, pPager->page
20690 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 50  Size);.        P
206a0 41 47 45 52 54 52 41 43 45 33 28 22 52 4f 4c 4c  AGERTRACE3("ROLL
206b0 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20  BACK-PAGE %d of 
206c0 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
206d0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
206e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
206f0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
20700 45 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63  E3("PAGE %d is c
20710 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70  lean on %d\n", p
20720 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
20730 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
20740 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  }.      clearHis
20750 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
20760 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b     p->dirty = 0;
20770 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72  .      p->inJour
20780 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
20790 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30  Hist->inStmt = 0
207a0 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70  ;.      pHist->p
207b0 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
207c0 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
207d0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
207e0 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
207f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
20800 78 52 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61  xReiniter(p, pPa
20810 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
20820 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20830 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
20840 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
20850 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
20860 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
20870 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
20880 53 69 7a 65 3b 0a 20 20 20 20 70 61 67 65 72 5f  Size;.    pager_
20890 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
208a0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
208b0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
208c0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
208d0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
208e0 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
208f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
20900 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64    if( !pPager->d
20910 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50  irtyCache || !pP
20920 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
20930 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  n ){.    rc = pa
20940 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
20950 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ion(pPager);.   
20960 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
20970 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
20980 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
20990 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
209a0 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  E_FULL ){.    if
209b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
209c0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
209d0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
209e0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
209f0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
20a00 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
20a10 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
20a20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
20a30 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
20a40 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
20a50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
20a60 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
20a70 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  );.    rc2 = pag
20a80 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
20a90 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  on(pPager);.    
20aa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20ab0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
20ac0 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  rc2;.    }.  }el
20ad0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
20ae0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
20af0 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a  er, 0);.  }.  /*
20b00 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
20b10 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65  ger); */.  pPage
20b20 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
20b30 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
20b40 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
20b50 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63  a ROLLBACK, we c
20b60 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75  an no longer tru
20b70 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a  st the pager.  *
20b80 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c  * cache. So call
20b90 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f   pager_error() o
20ba0 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f  n the way out to
20bb0 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20   make any error 
20bc0 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74  .  ** persistent
20bd0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
20be0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
20bf0 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  er, rc);.}../*.*
20c00 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
20c10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20c20 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
20c30 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
20c40 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
20c50 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
20c60 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
20c70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20c80 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
20c90 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
20ca0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
20cb0 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
20cc0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
20cd0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
20ce0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72  ces to the pager
20cf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20d00 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61  PagerRefcount(Pa
20d10 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20d20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
20d30 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Ref;.}..#ifdef S
20d40 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
20d50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
20d60 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
20d70 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
20d80 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
20d90 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50  ite3PagerStats(P
20da0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
20db0 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31   static int a[11
20dc0 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67  ];.  a[0] = pPag
20dd0 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d  er->nRef;.  a[1]
20de0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65   = pPager->nPage
20df0 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65  ;.  a[2] = pPage
20e00 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33  r->mxPage;.  a[3
20e10 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
20e20 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  ze;.  a[4] = pPa
20e30 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
20e40 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
20e50 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Code;.  a[6] = p
20e60 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
20e70 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
20e80 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b  iss;.  a[8] = 0;
20e90 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20    /* Used to be 
20ea0 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f  pPager->nOvfl */
20eb0 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
20ec0 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
20ed0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
20ee0 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  e;.  return a;.}
20ef0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
20f00 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  et the statement
20f10 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e   rollback point.
20f20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
20f30 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ine should be ca
20f40 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72  lled with the tr
20f50 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
20f60 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65  l already.** ope
20f70 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d  n.  A new statem
20f80 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63  ent journal is c
20f90 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20  reated that can 
20fa0 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62  be used to rollb
20fb0 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f  ack.** changes o
20fc0 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63  f a single SQL c
20fd0 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20  ommand within a 
20fe0 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69  larger transacti
20ff0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
21000 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e  e3PagerStmtBegin
21010 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21020 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
21030 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74  ert( !pPager->st
21040 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73  mtInUse );.  ass
21050 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
21060 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
21070 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21080 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
21090 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  );.  PAGERTRACE2
210a0 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c  ("STMT-BEGIN %d\
210b0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
210c0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
210d0 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
210e0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
210f0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
21100 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
21110 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72  bSize;.    retur
21120 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
21130 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
21140 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
21150 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
21160 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  utoopen = 1;.   
21170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21180 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
21190 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
211a0 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72  Open );.  pPager
211b0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69  ->aInStmt = sqli
211c0 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
211d0 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
211e0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
211f0 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  aInStmt==0 ){.  
21200 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f    /* sqlite3OsLo
21210 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
21220 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a  HARED_LOCK); */.
21230 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21240 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66  E_NOMEM;.  }.#if
21250 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63  ndef NDEBUG.  rc
21260 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
21270 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
21280 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  , &pPager->stmtJ
21290 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
212a0 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
212b0 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65  n_failed;.  asse
212c0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
212d0 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d  JSize == pPager-
212e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23  >journalOff );.#
212f0 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e  endif.  pPager->
21300 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67  stmtJSize = pPag
21310 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
21320 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
21330 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
21340 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ize;.  pPager->s
21350 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20  tmtHdrOff = 0;. 
21360 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
21370 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
21380 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70  umInit;.  if( !p
21390 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
213a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
213b0 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
213c0 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  (&pPager->stfd);
213d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
213e0 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
213f0 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72  iled;.    pPager
21400 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a  ->stmtOpen = 1;.
21410 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
21420 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NRec = 0;.  }.  
21430 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
21440 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  e = 1;.  return 
21450 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d  SQLITE_OK;. .stm
21460 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a  t_begin_failed:.
21470 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
21480 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c  nStmt ){.    sql
21490 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
214a0 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50  aInStmt);.    pP
214b0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
214c0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
214d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
214e0 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  mit a statement.
214f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
21500 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50  agerStmtCommit(P
21510 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21520 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
21530 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67  tInUse ){.    Pg
21540 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
21550 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  ;.    PAGERTRACE
21560 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25  2("STMT-COMMIT %
21570 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
21580 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
21590 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
215a0 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
215b0 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
215c0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
215d0 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
215e0 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a  r->stfd, 0); */.
215f0 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
21600 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
21610 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  t );.      pPage
21620 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->aInStmt = 0;.
21630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21640 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
21650 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
21660 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  =pNext){.       
21670 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
21680 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
21690 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
216a0 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
216b0 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
216c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
216d0 28 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20  ( pHist->inStmt 
216e0 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
216f0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
21700 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72        pHist->pPr
21710 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e  evStmt = pHist->
21720 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
21730 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
21740 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
21750 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
21760 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
21770 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
21780 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
21790 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
217a0 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
217b0 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
217c0 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
217d0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
217e0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
217f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
21800 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61  * Rollback a sta
21810 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
21820 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52  qlite3PagerStmtR
21830 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
21840 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
21850 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
21860 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
21870 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
21880 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  MT-ROLLBACK %d\n
21890 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
218a0 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  r));.    if( MEM
218b0 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  DB ){.      PgHd
218c0 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 50 67  r *pPg;.      Pg
218d0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
218e0 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
218f0 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
21900 3b 20 70 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65  ; pPg=pHist->pNe
21910 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20  xtStmt){.       
21920 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
21930 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
21940 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
21950 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
21960 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
21970 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
21980 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
21990 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
219a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
219b0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
219c0 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
219d0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
219e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
219f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
21a00 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
21a10 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
21a20 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 74 72  ;.      pager_tr
21a30 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
21a40 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
21a50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
21a60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
21a70 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61  = pager_stmt_pla
21a80 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
21a90 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
21aa0 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
21ab0 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
21ac0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
21ad0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
21ae0 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
21af0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
21b00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
21b10 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
21b20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
21b30 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
21b40 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
21b50 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50  3PagerFilename(P
21b60 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21b70 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21b80 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
21b90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
21ba0 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
21bb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21bc0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
21bd0 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d  lite3PagerDirnam
21be0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
21bf0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
21c00 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d  r->zDirectory;.}
21c10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
21c20 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
21c30 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
21c40 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
21c50 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
21c60 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67  rJournalname(Pag
21c70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
21c80 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a  eturn pPager->zJ
21c90 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ournal;.}../*.**
21ca0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
21cb0 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72  fsync() calls ar
21cc0 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74  e disabled for t
21cd0 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75  his pager.  Retu
21ce0 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66  rn FALSE.** if f
21cf0 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63  sync()s are exec
21d00 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a  uted normally..*
21d10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
21d20 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a  erNosync(Pager *
21d30 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
21d40 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  n pPager->noSync
21d50 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
21d60 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
21d70 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63  ** Set the codec
21d80 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a   for this pager.
21d90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
21da0 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20  agerSetCodec(.  
21db0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20  Pager *pPager,. 
21dc0 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
21dd0 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
21de0 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  o,int),.  void *
21df0 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70  pCodecArg.){.  p
21e00 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20  Pager->xCodec = 
21e10 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72  xCodec;.  pPager
21e20 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43  ->pCodecArg = pC
21e30 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69  odecArg;.}.#endi
21e40 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
21e50 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
21e60 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  M./*.** Move the
21e70 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64   page identified
21e80 20 62 79 20 70 44 61 74 61 20 74 6f 20 6c 6f 63   by pData to loc
21e90 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68  ation pgno in th
21ea0 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54  e file. .**.** T
21eb0 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
21ec0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
21ed0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 70  e current page p
21ee0 67 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e 74 20  gno. If current 
21ef0 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20  page.** pgno is 
21f00 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74  not already in t
21f10 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
21f20 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 77  nal, it is not w
21f30 72 69 74 74 65 6e 20 74 68 65 72 65 20 62 79 0a  ritten there by.
21f40 2a 2a 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ** by this routi
21f50 6e 65 2e 20 54 68 65 20 73 61 6d 65 20 61 70 70  ne. The same app
21f60 6c 69 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  lies to the page
21f70 20 70 44 61 74 61 20 72 65 66 65 72 73 20 74 6f   pData refers to
21f80 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20   on entry to.** 
21f90 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
21fa0 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74  .** References t
21fb0 6f 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  o the page refer
21fc0 65 64 20 74 6f 20 62 79 20 70 44 61 74 61 20 72  ed to by pData r
21fd0 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64  emain valid. Upd
21fe0 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74  ating any.** met
21ff0 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a-data associate
22000 64 20 77 69 74 68 20 70 61 67 65 20 70 44 61 74  d with page pDat
22010 61 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f  a (i.e. data sto
22020 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72  red in the nExtr
22030 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63  a bytes.** alloc
22040 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
22050 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65  the page) is the
22060 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
22070 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  of the caller..*
22080 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69  *.** A transacti
22090 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  on must be activ
220a0 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
220b0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49  ine is called. I
220c0 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20  t used to be.** 
220d0 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20  required that a 
220e0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
220f0 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63  ction was not ac
22100 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72  tive, but this r
22110 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61  estriction.** ha
22120 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28  s been removed (
22130 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65  CREATE INDEX nee
22140 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67  ds to move a pag
22150 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65  e when a stateme
22160 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
22170 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f  n is active)..*/
22180 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22190 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20  rMovepage(Pager 
221a0 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20  *pPager, DbPage 
221b0 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pPg, Pgno pgno)
221c0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  {.  PgHdr *pPgOl
221d0 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50  d; .  int h;.  P
221e0 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  gno needSyncPgno
221f0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
22200 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
22210 0a 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22  .  PAGERTRACE5("
22220 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20  MOVE %d page %d 
22230 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f  (needSync=%d) mo
22240 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20  ves to %d\n", . 
22250 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
22260 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
22270 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20   pPg->needSync, 
22280 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45  pgno);.  IOTRACE
22290 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64  (("MOVE %p %d %d
222a0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
222b0 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a  ->pgno, pgno))..
222c0 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74    pager_get_cont
222d0 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20  ent(pPg);.  if( 
222e0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
222f0 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
22300 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
22310 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
22320 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  inJournal );.   
22330 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
22340 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  rty );.    asser
22350 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
22360 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
22370 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
22380 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e   it's hash-chain
22390 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
223a0 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
223b0 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  g);..  /* If the
223c0 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
223d0 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
223e0 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
223f0 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
22400 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
22410 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
22420 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
22430 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
22440 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
22450 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
22460 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
22470 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
22480 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
22490 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
224a0 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20    */.  pPgOld = 
224b0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
224c0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
224d0 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
224e0 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e  assert( pPgOld->
224f0 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75  nRef==0 );.    u
22500 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
22510 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a  Pager, pPgOld);.
22520 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
22530 67 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 70  gOld);.    if( p
22540 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20  PgOld->needSync 
22550 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
22560 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e   pPgOld->inJourn
22570 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  al );.      pPg-
22580 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
22590 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
225a0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  ync = 1;.      a
225b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
225c0 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d  eedSync );.    }
225d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  .  }..  /* Chang
225e0 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
225f0 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e  r for pPg and in
22600 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
22610 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e   new hash-chain.
22620 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67   */.  assert( pg
22630 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e  no!=0 );.  pPg->
22640 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68  pgno = pgno;.  h
22650 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65   = pgno & (pPage
22660 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69  r->nHash-1);.  i
22670 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
22680 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72  [h] ){.    asser
22690 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
226a0 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  [h]->pPrevHash==
226b0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
226c0 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76  >aHash[h]->pPrev
226d0 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  Hash = pPg;.  }.
226e0 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
226f0 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
22700 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  [h];.  pPager->a
22710 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
22720 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
22730 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74  = 0;..  makeDirt
22740 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72  y(pPg);.  pPager
22750 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
22760 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
22770 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
22780 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
22790 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
227a0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
227b0 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
227c0 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
227d0 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
227e0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
227f0 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
22800 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
22810 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
22820 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
22830 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
22840 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
22850 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e      ** Pager.aIn
22860 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20  Journal bit has 
22870 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e  been set. This n
22880 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64  eeds to be remed
22890 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20  ied by loading. 
228a0 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69     ** the page i
228b0 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61  nto the pager-ca
228c0 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20  che and setting 
228d0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
228e0 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  nc flag..    **.
228f0 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
22900 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c  e3PagerGet() cal
22910 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
22920 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
22930 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
22940 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
22950 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
22960 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
22970 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
22980 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
22990 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
229a0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
229b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
229c0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
229d0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
229e0 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
229f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
22a00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
22a10 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
22a20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  = 1;.    pPgHdr-
22a30 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
22a40 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75     pPgHdr->inJou
22a50 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61  rnal = 1;.    ma
22a60 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b  keDirty(pPgHdr);
22a70 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
22a80 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
22a90 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
22aa0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
22ab0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
22ac0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
22ad0 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70   data for the sp
22ae0 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
22af0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
22b00 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67  gerGetData(DbPag
22b10 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
22b20 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  n PGHDR_TO_DATA(
22b30 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pPg);.}../*.** R
22b40 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22b50 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78  to the Pager.nEx
22b60 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78  tra bytes of "ex
22b70 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61  tra" space .** a
22b80 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
22b90 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
22ba0 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
22bb0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
22bc0 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50  Extra(DbPage *pP
22bd0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
22be0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
22bf0 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61  r;.  return (pPa
22c00 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54  ger?PGHDR_TO_EXT
22c10 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a  RA(pPg, pPager):
22c20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  0);.}../*.** Get
22c30 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67  /set the locking
22c40 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
22c50 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
22c60 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
22c70 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f  e.** of PAGER_LO
22c80 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c  CKINGMODE_QUERY,
22c90 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
22ca0 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a  DE_NORMAL or .**
22cb0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
22cc0 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66  DE_EXCLUSIVE. If
22cd0 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
22ce0 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
22cf0 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e  en.** the lockin
22d00 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f  g-mode is set to
22d10 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69   the value speci
22d20 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fied..**.** The 
22d30 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
22d40 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c  s either PAGER_L
22d50 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
22d60 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f  L or.** PAGER_LO
22d70 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
22d80 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  IVE, indicating 
22d90 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
22da0 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a  sibly updated).*
22db0 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a  * locking-mode..
22dc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
22dd0 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50  gerLockingMode(P
22de0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
22df0 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65  t eMode){.  asse
22e00 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
22e10 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
22e20 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  RY.            |
22e30 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
22e40 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
22e50 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
22e60 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
22e70 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
22e80 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
22e90 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
22ea0 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20  DE_QUERY<0 );.  
22eb0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
22ec0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
22ed0 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43  >=0 && PAGER_LOC
22ee0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
22ef0 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65  VE>=0 );.  if( e
22f00 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67  Mode>=0 && !pPag
22f10 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
22f20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c      pPager->excl
22f30 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64  usiveMode = eMod
22f40 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
22f50 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63  (int)pPager->exc
22f60 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23  lusiveMode;.}..#
22f70 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
22f80 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
22f90 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
22fa0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
22fb0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
22fc0 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b  of the file lock
22fd0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
22fe0 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74  ager..** The ret
22ff0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65  urn value is one
23000 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41   of NO_LOCK, SHA
23010 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
23020 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44  ED_LOCK,.** PEND
23030 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43  ING_LOCK, or EXC
23040 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a  LUSIVE_LOCK..*/.
23050 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
23060 4c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20  Lockstate(Pager 
23070 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
23080 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  rn sqlite3OsLock
23090 53 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  State(pPager->fd
230a0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
230b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
230c0 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c  ./*.** Print a l
230d0 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65  isting of all re
230e0 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61  ferenced pages a
230f0 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75  nd their ref cou
23100 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
23110 74 65 33 50 61 67 65 72 52 65 66 64 75 6d 70 28  te3PagerRefdump(
23120 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
23130 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
23140 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
23150 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
23160 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
23170 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
23180 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  <=0 ) continue;.
23190 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
231a0 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64  Printf("PAGE %3d
231b0 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64   addr=%p nRef=%d
231c0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67  \n", .       pPg
231d0 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f  ->pgno, PGHDR_TO
231e0 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d  _DATA(pPg), pPg-
231f0 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65  >nRef);.  }.}.#e
23200 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ndif..#endif /* 
23210 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
23220 49 4f 20 2a 2f 0a                                IO */.