/ Hex Artifact Content
Login

Artifact 33c632ce9c228d87f14879a139fa123d43e4bf25:


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 32  : pager.c,v 1.32
0350: 39 20 32 30 30 37 2f 30 34 2f 31 36 20 31 35 3a  9 2007/04/16 15:
0360: 30 32 3a 31 39 20 64 72 68 20 45 78 70 20 24 0a  02:19 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 50 6c 61 79  c;.}../*.** Play
b0a0: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
b0b0: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
b0c0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
b0d0: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
b0e0: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
b0f0: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
b100: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
b110: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
b120: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
b130: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
b140: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
b150: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
b160: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
b170: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
b180: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
b190: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
b1a0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
b1b0: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
b1c0: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
b1d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
b1e0: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
b1f0: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
b200: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
b210: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
b220: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
b230: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
b240: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
b250: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
b260: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
b270: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
b280: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
b290: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
b2a0: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
b2b0: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
b2c0: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
b2d0: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
b2e0: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
b2f0: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
b300: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
b310: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
b320: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
b330: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
b340: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
b350: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
b360: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
b370: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
b380: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
b390: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
b3a0: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
b3b0: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
b3c0: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
b3d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
b3e0: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
b3f0: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
b400: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
b410: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
b420: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
b430: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
b440: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
b450: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
b460: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
b470: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
b480: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
b490: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
b4a0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
b4b0: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
b4c0: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
b4d0: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
b4e0: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
b4f0: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
b500: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
b510: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
b520: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
b530: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
b540: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
b550: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
b560: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
b570: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
b580: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
b590: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
b5a0: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
b5b0: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
b5c0: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
b5d0: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
b5e0: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
b5f0: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
b600: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
b610: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
b620: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
b630: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
b640: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
b650: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
b660: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
b670: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
b680: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
b690: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
b6a0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
b6b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
b6c0: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
b6d0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
b6e0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
b6f0: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
b700: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
b710: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
b720: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
b730: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b740: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
b750: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
b760: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
b770: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
b780: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
b790: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
b7a0: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
b7b0: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
b7c0: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
b7d0: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
b7e0: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
b7f0: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
b800: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
b810: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
b820: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
b830: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
b840: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
b850: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
b860: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
b870: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
b880: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
b890: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
b8a0: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
b8b0: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
b8c0: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
b8d0: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
b8e0: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
b8f0: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
b900: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
b910: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
b920: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
b930: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
b940: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
b950: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
b960: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
b970: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
b980: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
b990: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
b9a0: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
b9b0: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
b9c0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
b9d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
b9e0: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
b9f0: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
ba00: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
ba10: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
ba20: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
ba30: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
ba40: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
ba50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
ba60: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
ba70: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
ba80: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
ba90: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
baa0: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
bab0: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
bac0: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
bad0: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
bae0: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
baf0: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
bb00: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
bb10: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
bb20: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
bb30: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
bb40: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
bb50: 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
bb60: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bb80: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
bb90: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
bba0: 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bbc0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
bbd0: 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
bbe0: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  al */.  int i;  
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
bc10: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
bc20: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
bc30: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
bc40: 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
bc50: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
bc60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bc70: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
bc80: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
bc90: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
bca0: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
bcb0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
bcc0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
bcd0: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
bce0: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
bcf0: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
bd00: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
bd10: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
bd20: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
bd30: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
bd40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bd50: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
bd60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bd70: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
bd80: 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
bd90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
bda0: 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
bdb0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
bdc0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
bdd0: 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
bde0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
bdf0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
be00: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
be10: 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
be20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
be30: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
be40: 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
be50: 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
be60: 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
be70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
be80: 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
be90: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
bea0: 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
beb0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
bec0: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
bed0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61  Pager->jfd, &zMa
bee0: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
bef0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
bf00: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
bf10: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
bf20: 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f  ter && !sqlite3O
bf30: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
bf40: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ter)) ){.    sql
bf50: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
bf60: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
bf70: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
bf80: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
bf90: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
bfa0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
bfb0: 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ck;.  }.  sqlite
bfc0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
bfd0: 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65  jfd, 0);.  pPage
bfe0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
bff0: 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
c000: 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
c010: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
c020: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
c030: 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
c040: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
c050: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
c060: 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
c070: 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
c080: 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
c090: 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
c0a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
c0b0: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
c0c0: 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
c0d0: 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
c0e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c0f0: 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
c100: 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
c110: 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
c120: 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
c130: 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
c140: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
c150: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
c160: 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
c170: 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
c180: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
c190: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
c1a0: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
c1b0: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
c1c0: 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
c1d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c1e0: 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
c1f0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
c200: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
c210: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
c220: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
c230: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
c240: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
c250: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
c260: 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
c270: 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
c280: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
c290: 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
c2a0: 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
c2b0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
c2c0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
c2d0: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
c2e0: 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
c2f0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
c300: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
c310: 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
c320: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
c330: 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
c340: 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
c350: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
c360: 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
c370: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c380: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c390: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
c3a0: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
c3b0: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
c3c0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c3d0: 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
c3e0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c3f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c400: 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
c410: 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
c420: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
c430: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
c440: 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e  .    ** process.
c450: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
c460: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
c470: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 73 69  urnal file consi
c480: 73 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 6a 6f  sts of.    ** jo
c490: 75 72 6e 61 6c 6c 65 64 20 63 6f 70 69 65 73 20  urnalled copies 
c4a0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  of pages that ne
c4b0: 65 64 20 74 6f 20 62 65 20 72 65 61 64 20 62 61  ed to be read ba
c4c0: 63 6b 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ck into the cach
c4d0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
c4e0: 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
c4f0: 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Hot ){.      nRe
c500: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
c510: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
c520: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
c530: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
c540: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
c550: 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
c560: 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
c570: 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
c580: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
c590: 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
c5a0: 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c  to it's original
c5b0: 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
c5c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
c5d0: 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
c5e0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
c5f0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
c600: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
c610: 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
c620: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c630: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c640: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
c650: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
c660: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
c670: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
c680: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c690: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
c6a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
c6b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
c6c0: 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
c6d0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
c6e0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
c6f0: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
c700: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
c710: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c720: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c730: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c740: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
c750: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
c760: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
c770: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
c780: 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
c790: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
c7a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c7b0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c7c0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
c7d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c7e0: 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
c7f0: 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
c800: 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
c810: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c820: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
c830: 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
c840: 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
c850: 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20  }.  if( zMaster 
c860: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
c870: 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
c880: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
c890: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
c8a0: 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
c8b0: 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
c8c0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
c8d0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
c8e0: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
c8f0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c900: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
c910: 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
c920: 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ter(zMaster);.  
c930: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
c940: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(zMaster);.  }
c950: 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
c960: 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
c970: 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
c980: 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
c990: 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
c9a0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
c9b0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
c9c0: 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
c9d0: 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
c9e0: 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
c9f0: 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
ca00: 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
ca10: 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
ca20: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
ca30: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
ca40: 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
ca50: 72 2d 3e 66 64 29 3b 0a 20 20 72 65 74 75 72 6e  r->fd);.  return
ca60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c   rc;.}../*.** Pl
ca70: 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  ayback the state
ca80: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
ca90: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69  .** This is simi
caa0: 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  lar to playing b
cab0: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
cac0: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20  ion journal but 
cad0: 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78  with.** a few ex
cae0: 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a  tra twists..**.*
caf0: 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75  *    (1)  The nu
cb00: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
cb10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
cb20: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
cb30: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  of.**         th
cb40: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  e statement is s
cb50: 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d  tored in pPager-
cb60: 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69  >stmtSize, not i
cb70: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
cb80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
cb90: 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  self..**.**    (
cba0: 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  2)  In addition 
cbb0: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
cbc0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
cbd0: 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20  urnal, also.**  
cbe0: 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20         playback 
cbf0: 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65  all pages of the
cc00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
cc10: 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  rnal beginning.*
cc20: 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66  *         at off
cc30: 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  set pPager->stmt
cc40: 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  JSize..*/.static
cc50: 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f   int pager_stmt_
cc60: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
cc70: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73  pPager){.  i64 s
cc80: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
cc90: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
cca0: 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
ccb0: 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b  */.  i64 hdrOff;
ccc0: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
cce0: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
ccf0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd10: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
cd20: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73  /.  int rc;..  s
cd30: 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
cd40: 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66  rnalOff;.#ifndef
cd50: 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20   NDEBUG .  {.   
cd60: 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20   i64 os_szJ;.   
cd70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
cd80: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
cd90: 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20  jfd, &os_szJ);. 
cda0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
cdb0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
cdc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
cdd0: 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d  J==os_szJ );.  }
cde0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65  .#endif..  /* Se
cdf0: 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74  t hdrOff to be t
ce00: 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61  he offset just a
ce10: 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
ce20: 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c  the last journal
ce30: 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74  .  ** page writt
ce40: 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  en before the fi
ce50: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
ce60: 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  er for this stat
ce70: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
ce80: 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74  action was writt
ce90: 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f  en, or the end o
cea0: 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f  f the file if no
ceb0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65   journal.  ** he
cec0: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
ced0: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20  ..  */.  hdrOff 
cee0: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  = pPager->stmtHd
cef0: 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  rOff;.  assert( 
cf00: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
cf10: 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20   || !hdrOff );. 
cf20: 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a   if( !hdrOff ){.
cf30: 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a      hdrOff = szJ
cf40: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72  ;.  }.  .  /* Tr
cf50: 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
cf60: 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ase back to its 
cf70: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
cf80: 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
cf90: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
cfa0: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
cfb0: 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ze);.  assert( p
cfc0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
cfd0: 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
cfe0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
cff0: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
d000: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
d010: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
d020: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
d030: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
d040: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
d050: 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74  lOpen );.  sqlit
d060: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
d070: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65  >stfd, 0);.  nRe
d080: 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  c = pPager->stmt
d090: 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f  NRec;.  .  /* Co
d0a0: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
d0b0: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61  s out of the sta
d0c0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  tement journal a
d0d0: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
d0e0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
d0f0: 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ile.  Note that 
d100: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d110: 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63  urnal omits chec
d120: 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  ksums from.  ** 
d130: 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63  each record sinc
d140: 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  e power-failure 
d150: 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20  recovery is not 
d160: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61  important to sta
d170: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72  tement.  ** jour
d180: 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  nals..  */.  for
d190: 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b  (i=nRec-1; i>=0;
d1a0: 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20   i--){.    rc = 
d1b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
d1c0: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
d1d0: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
d1e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
d1f0: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
d200: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d210: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
d220: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
d230: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72  .  }..  /* Now r
d240: 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62  oll some pages b
d250: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61  ack from the tra
d260: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
d270: 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a  . Pager.stmtJSiz
d280: 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73  e.  ** was the s
d290: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
d2a0: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  al file when thi
d2b0: 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  s statement was 
d2c0: 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a  started, so.  **
d2d0: 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65   everything afte
d2e0: 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  r that needs to 
d2f0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  be rolled back, 
d300: 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a  either into the.
d310: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74    ** database, t
d320: 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c  he memory cache,
d330: 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20   or both..  **. 
d340: 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74   ** If it is not
d350: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65   zero, then Page
d360: 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20  r.stmtHdrOff is 
d370: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
d380: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
d390: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
d3a0: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
d3b0: 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61   during this sta
d3c0: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
d3d0: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
d3e0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
d3f0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
d400: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
d410: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d420: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
d430: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
d440: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
d450: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61  journalOff = pPa
d460: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a  ger->stmtJSize;.
d470: 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49    pPager->cksumI
d480: 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  nit = pPager->st
d490: 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65  mtCksum;.  while
d4a0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
d4b0: 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b  lOff < hdrOff ){
d4c0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
d4d0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
d4e0: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
d4f0: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61  ->jfd, 1);.    a
d500: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
d510: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
d520: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d530: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
d540: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
d550: 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
d560: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
d570: 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   ){.    u32 nJRe
d580: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  c;         /* Nu
d590: 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
d5a0: 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
d5b0: 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
d5c0: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
d5d0: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
d5e0: 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
d5f0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d600: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
d610: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
d620: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
d630: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
d640: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
d650: 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29    if( nJRec==0 )
d660: 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
d670: 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
d680: 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50  ournalOff) / (pP
d690: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
d6a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
d6b0: 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30  (i=nJRec-1; i>=0
d6c0: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
d6d0: 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d  nalOff < szJ; i-
d6e0: 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  -){.      rc = p
d6f0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
d700: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
d710: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a  Pager->jfd, 1);.
d720: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
d730: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
d740: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
d750: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
d760: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d770: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
d780: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d790: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64  ff = szJ;.  .end
d7a0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a  _stmt_playback:.
d7b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d7c0: 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65  _OK) {.    pPage
d7d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
d7e0: 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65  szJ;.    /* page
d7f0: 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70  r_reload_cache(p
d800: 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20  Pager); */.  }. 
d810: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
d820: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
d830: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
d840: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
d850: 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
d860: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
d870: 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
d880: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
d890: 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
d8a0: 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30  .  if( mxPage>10
d8b0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
d8c0: 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b  mxPage = mxPage;
d8d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
d8e0: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
d8f0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
d900: 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
d910: 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
d920: 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
d930: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
d940: 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
d950: 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
d960: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
d970: 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
d980: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
d990: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
d9a0: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
d9b0: 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
d9c0: 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
d9d0: 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
d9e0: 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
d9f0: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
da00: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
da10: 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
da20: 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
da30: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
da40: 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
da50: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
da60: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
da70: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
da90: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
daa0: 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
dab0: 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
dac0: 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
dad0: 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
dae0: 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
daf0: 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
db00: 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
db10: 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
db20: 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
db30: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
db40: 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
db50: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
db60: 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
db70: 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
db80: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
db90: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
dba0: 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
dbb0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
dbc0: 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
dbd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
dbe0: 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
dbf0: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
dc00: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
dc10: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
dc20: 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
dc30: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
dc40: 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
dc50: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
dc60: 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
dc70: 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
dc80: 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
dc90: 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
dca0: 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
dcb0: 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
dcc0: 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
dcd0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
dce0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
dcf0: 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
dd00: 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
dd10: 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
dd20: 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
dd30: 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
dd40: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
dd50: 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
dd70: 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
dd80: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
dd90: 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
dda0: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  lback..**.** Num
ddb0: 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
ddc0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
ddd0: 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
dde0: 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
ddf0: 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
de00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
de10: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
de20: 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
de30: 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
de40: 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  el(Pager *pPager
de50: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74  , int level, int
de60: 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20   full_fsync){.  
de70: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
de80: 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50    level==1 || pP
de90: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
dea0: 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
deb0: 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26  nc = level==3 &&
dec0: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
ded0: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
dee0: 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c 5f  ll_fsync = full_
def0: 66 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50 61  fsync;.  if( pPa
df00: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50  ger->noSync ) pP
df10: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
df20: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
df30: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
df40: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
df50: 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
df60: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
df70: 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
df80: 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
df90: 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
dfa0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
dfb0: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
dfc0: 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
dfd0: 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
dfe0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
dff0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
e000: 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
e010: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
e020: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
e030: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ile. .**.** Writ
e040: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
e050: 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20  iptor into *fd. 
e060: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
e070: 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
e080: 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72  some.** other er
e090: 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
e0a0: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ail..**.** The O
e0b0: 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
e0c0: 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20  ally delete the 
e0d0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
e0e0: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f  hen it is.** clo
e0f0: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
e100: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
e110: 70 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65 20 2a  pentemp(OsFile *
e120: 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74  *pFd){.  int cnt
e130: 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 8;.  int rc;.
e140: 20 20 63 68 61 72 20 7a 46 69 6c 65 5b 53 51 4c    char zFile[SQL
e150: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
e160: 45 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  E];..#ifdef SQLI
e170: 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
e180: 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
e190: 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
e1a0: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
e1b0: 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
e1c0: 6e 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20 63  ndif.  do{.    c
e1d0: 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt--;.    sqlite
e1e0: 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  3OsTempFileName(
e1f0: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  zFile);.    rc =
e200: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
e210: 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 70  clusive(zFile, p
e220: 46 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  Fd, 1);.    asse
e230: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
e240: 4b 20 7c 7c 20 2a 70 46 64 20 29 3b 0a 20 20 7d  K || *pFd );.  }
e250: 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20  while( cnt>0 && 
e260: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
e270: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
e280: 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  M );.  return rc
e290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
e2a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63  e a new page cac
e2b0: 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  he and put a poi
e2c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
e2d0: 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67   cache in *ppPag
e2e0: 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  er..** The file 
e2f0: 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65  to be cached nee
e300: 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68  d not exist.  Th
e310: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f  e file is not lo
e320: 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68  cked until.** th
e330: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
e340: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
e350: 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65  ) and is only he
e360: 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68  ld open until th
e370: 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69  e.** last page i
e380: 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  s released using
e390: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
e3a0: 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ef()..**.** If z
e3b0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
e3c0: 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
e3d0: 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
e3e0: 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
e3f0: 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
e400: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
e410: 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65  ached.  The file
e420: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
e430: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
e440: 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  y when it is clo
e450: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  sed..**.** If zF
e460: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
e470: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69  ory:" then all i
e480: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
e490: 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20  ld in cache..** 
e4a0: 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
e4b0: 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68  ten to disk.  Th
e4c0: 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
e4d0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a  o implement an.*
e4e0: 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
e4f0: 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
e500: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
e510: 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
e520: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
e530: 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
e540: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
e550: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
e560: 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
e570: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
e580: 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
e590: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e5b0: 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
e5c0: 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
e5d0: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
e5e0: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
e5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
e600: 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
e610: 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  is file */.){.  
e620: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
e630: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  0;.  char *zFull
e640: 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Pathname = 0;.  
e650: 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a  int nameLen;  /*
e660: 20 43 6f 6d 70 69 6c 65 72 20 69 73 20 77 72 6f   Compiler is wro
e670: 6e 67 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61  ng. This is alwa
e680: 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  ys initialized b
e690: 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20 4f  efore use */.  O
e6a0: 73 46 69 6c 65 20 2a 66 64 20 3d 20 30 3b 0a 20  sFile *fd = 0;. 
e6b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e6c0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  _OK;.  int i;.  
e6d0: 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
e6e0: 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  ;.  int memDb = 
e6f0: 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  0;.  int readOnl
e700: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65  y = 0;.  int use
e710: 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
e720: 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
e730: 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74  URNAL)==0;.  int
e740: 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66   noReadlock = (f
e750: 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f  lags & PAGER_NO_
e760: 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20  READLOCK)!=0;.  
e770: 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54  char zTemp[SQLIT
e780: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
e790: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
e7a0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
e7b0: 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20  NAGEMENT.  /* A 
e7c0: 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20  malloc() cannot 
e7d0: 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54  fail in sqlite3T
e7e0: 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f  hreadData() as o
e7f0: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73  ne or more calls
e800: 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   to .  ** malloc
e810: 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  () must have alr
e820: 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62  eady been made b
e830: 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65  y this thread be
e840: 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a  fore it gets.  *
e850: 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e  * to this point.
e860: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
e870: 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20  ThreadData must 
e880: 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61  have been alloca
e890: 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ted already.  **
e8a0: 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44   so that ThreadD
e8b0: 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62  ata.nAlloc can b
e8c0: 65 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20  e set. It would 
e8d0: 62 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72  be nice to asser
e8e0: 74 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65  t.  ** that Thre
e8f0: 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73  adData.nAlloc is
e900: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61   non-zero, but a
e910: 6c 61 73 20 74 68 69 73 20 62 72 65 61 6b 73 20  las this breaks 
e920: 74 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a  test cases .  **
e930: 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f   written to invo
e940: 6b 65 20 74 68 65 20 70 61 67 65 72 20 64 69 72  ke the pager dir
e950: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68  ectly..  */.  Th
e960: 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d  readData *pTsd =
e970: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
e980: 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta();.  assert( 
e990: 70 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  pTsd );.#endif..
e9a0: 20 20 2f 2a 20 57 65 20 75 73 65 64 20 74 6f 20    /* We used to 
e9b0: 74 65 73 74 20 69 66 20 6d 61 6c 6c 6f 63 28 29  test if malloc()
e9c0: 20 68 61 64 20 61 6c 72 65 61 64 79 20 66 61 69   had already fai
e9d0: 6c 65 64 20 62 65 66 6f 72 65 20 70 72 6f 63 65  led before proce
e9e0: 65 64 69 6e 67 2e 20 0a 20 20 2a 2a 20 42 75 74  eding. .  ** But
e9f0: 20 74 68 65 20 77 61 79 20 74 68 69 73 20 66 75   the way this fu
ea00: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69  nction is used i
ea10: 6e 20 53 51 4c 69 74 65 20 6d 65 61 6e 73 20 74  n SQLite means t
ea20: 68 61 74 20 63 61 6e 20 6e 65 76 65 72 0a 20 20  hat can never.  
ea30: 2a 2a 20 68 61 70 70 65 6e 2e 20 46 75 72 74 68  ** happen. Furth
ea40: 65 72 6d 6f 72 65 2c 20 69 66 20 74 68 65 20 6d  ermore, if the m
ea50: 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61  alloc-failed fla
ea60: 67 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  g is already set
ea70: 2c 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 74  , .  ** either t
ea80: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
ea90: 65 53 74 72 44 75 70 28 29 20 6f 72 20 73 71 6c  eStrDup() or sql
eaa0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 62 65 6c 6f  iteMalloc() belo
eab0: 77 20 77 69 6c 6c 0a 20 20 2a 2a 20 66 61 69 6c  w will.  ** fail
eac0: 20 73 68 6f 72 74 6c 79 20 61 6e 64 20 53 51 4c   shortly and SQL
ead0: 49 54 45 5f 4e 4f 4d 45 4d 20 72 65 74 75 72 6e  ITE_NOMEM return
eae0: 65 64 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a  ed anyway..  */.
eaf0: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
eb00: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
eb10: 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73 65  ager file and se
eb20: 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t zFullPathname 
eb30: 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c  to point at mall
eb40: 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d  oc()ed .  ** mem
eb50: 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ory containing t
eb60: 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65  he complete file
eb70: 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75  name (i.e. inclu
eb80: 64 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  ding the directo
eb90: 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ry)..  */.  if( 
eba0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
ebb0: 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66  lename[0] ){.#if
ebc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ebd0: 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66  _MEMORYDB.    if
ebe0: 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  ( strcmp(zFilena
ebf0: 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  me,":memory:")==
ec00: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62  0 ){.      memDb
ec10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c   = 1;.      zFul
ec20: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
ec30: 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20  teStrDup("");.  
ec40: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
ec50: 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c     {.      zFull
ec60: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
ec70: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
ec80: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
ec90: 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68     if( zFullPath
eca0: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  name ){.        
ecb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
ecc0: 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c  enReadWrite(zFul
ecd0: 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20  lPathname, &fd, 
ece0: 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20  &readOnly);.    
ecf0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
ed00: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66 64 20  SQLITE_OK || fd 
ed10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ed20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
ed30: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
ed40: 70 65 6e 74 65 6d 70 28 26 66 64 29 3b 0a 20 20  pentemp(&fd);.  
ed50: 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46    sqlite3OsTempF
ed60: 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29 3b 0a  ileName(zTemp);.
ed70: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
ed80: 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c  zTemp;.    zFull
ed90: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
eda0: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
edb0: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
edc0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
edd0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70  OK ){.      temp
ede0: 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  File = 1;.    }.
edf0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
ee00: 74 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72  te the Pager str
ee10: 75 63 74 75 72 65 2e 20 41 73 20 70 61 72 74 20  ucture. As part 
ee20: 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c 6f  of the same allo
ee30: 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65  cation, allocate
ee40: 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20  .  ** space for 
ee50: 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20 6f  the full paths o
ee60: 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72 65  f the file, dire
ee70: 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e 61  ctory and journa
ee80: 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e 7a  l .  ** (Pager.z
ee90: 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72 2e  Filename, Pager.
eea0: 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20 50  zDirectory and P
eeb0: 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a  ager.zJournal)..
eec0: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c    */.  if( zFull
eed0: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
eee0: 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e  nameLen = strlen
eef0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
ef00: 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71  .    pPager = sq
ef10: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
ef20: 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61  of(*pPager) + na
ef30: 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a  meLen*3 + 30 );.
ef40: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 20 26      if( pPager &
ef50: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
ef60: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
ef70: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28 63 68  >pTmpSpace = (ch
ef80: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
ef90: 63 52 61 77 28 53 51 4c 49 54 45 5f 44 45 46 41  cRaw(SQLITE_DEFA
efa0: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
efb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a      }.  }...  /*
efc0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
efd0: 75 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f  ured in either o
efe0: 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f  f the blocks abo
eff0: 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d 65 6d  ve, free the mem
f000: 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  ory .  ** pointe
f010: 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61 74  d to by zFullPat
f020: 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68 65 20  hname, free the 
f030: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
f040: 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 0a 20  and close the . 
f050: 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65 20   ** file. Since 
f060: 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
f070: 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65   allocated there
f080: 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73   is no need to s
f090: 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67  et .  ** any Pag
f0a0: 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61  er.errMask varia
f0b0: 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bles..  */.  if(
f0c0: 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a 46 75   !pPager || !zFu
f0d0: 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20 21 70  llPathname || !p
f0e0: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
f0f0: 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   || rc!=SQLITE_O
f100: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
f110: 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20  OsClose(&fd);.  
f120: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
f130: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
f140: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
f150: 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
f160: 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ((rc==SQLITE_OK)
f170: 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63  ?SQLITE_NOMEM:rc
f180: 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
f190: 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25  RACE3("OPEN %d %
f1a0: 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
f1b0: 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74  ID(fd), zFullPat
f1c0: 68 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43  hname);.  IOTRAC
f1d0: 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
f1e0: 22 2c 20 70 50 61 67 65 72 2c 20 7a 46 75 6c 6c  ", pPager, zFull
f1f0: 50 61 74 68 6e 61 6d 65 29 29 0a 20 20 70 50 61  Pathname)).  pPa
f200: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
f210: 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b   (char*)&pPager[
f220: 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44  1];.  pPager->zD
f230: 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67  irectory = &pPag
f240: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61  er->zFilename[na
f250: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67  meLen+1];.  pPag
f260: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
f270: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
f280: 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20  ry[nameLen+1];. 
f290: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
f2a0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c  zFilename, zFull
f2b0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Pathname);.  str
f2c0: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
f2d0: 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74  ectory, zFullPat
f2e0: 68 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 69  hname);..  for(i
f2f0: 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26  =nameLen; i>0 &&
f300: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
f310: 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69  ory[i-1]!='/'; i
f320: 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20  --){}.  if( i>0 
f330: 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  ) pPager->zDirec
f340: 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20  tory[i-1] = 0;. 
f350: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
f360: 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50  zJournal, zFullP
f370: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  athname);.  sqli
f380: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
f390: 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28  name);.  strcpy(
f3a0: 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
f3b0: 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f  l[nameLen], "-jo
f3c0: 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65  urnal");.  pPage
f3d0: 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a  r->fd = fd;.  /*
f3e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f3f0: 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Open = 0; */.  p
f400: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
f410: 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26  l = useJournal &
f420: 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  & !memDb;.  pPag
f430: 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
f440: 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72   noReadlock && r
f450: 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
f460: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
f470: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
f480: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
f490: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
f4a0: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
f4b0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
f4c0: 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50   = memDb-1;.  pP
f4d0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
f4e0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
f4f0: 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20  PAGE_SIZE;.  /* 
f500: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
f510: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
f520: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
f530: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f540: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
f550: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
f560: 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b 20 2a 2f  nMaxPage = 0; */
f570: 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  .  pPager->mxPag
f580: 65 20 3d 20 31 30 30 3b 0a 20 20 61 73 73 65 72  e = 100;.  asser
f590: 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d  t( PAGER_UNLOCK=
f5a0: 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  =0 );.  /* pPage
f5b0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
f5c0: 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a  _UNLOCK; */.  /*
f5d0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
f5e0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
f5f0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65  r->tempFile = te
f600: 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
f610: 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
f620: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
f630: 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
f640: 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
f650: 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
f660: 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
f670: 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
f680: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
f690: 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
f6a0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
f6b0: 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  = tempFile; .  p
f6c0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d  Pager->memDb = m
f6d0: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
f6e0: 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
f6f0: 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
f700: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
f710: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  */.  pPager->noS
f720: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
f730: 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
f740: 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
f750: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61  >fullSync = (pPa
f760: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29  ger->noSync?0:1)
f770: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
f780: 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
f790: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
f7a0: 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
f7b0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
f7c0: 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
f7d0: 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f  ger->nExtra = FO
f7e0: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45  RCE_ALIGNMENT(nE
f7f0: 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74 28  xtra);.  assert(
f800: 66 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66  fd||memDb);.  if
f810: 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  ( !memDb ){.    
f820: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
f830: 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
f840: 63 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20 20  ctorSize(fd);.  
f850: 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
f860: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
f870: 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28   */.  /* memset(
f880: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
f890: 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
f8a0: 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a  >aHash)); */.  *
f8b0: 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
f8c0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f8d0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
f8e0: 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65  NAGEMENT.  pPage
f8f0: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64 2d  r->pNext = pTsd-
f900: 3e 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64 2d  >pPager;.  pTsd-
f910: 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
f920: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
f930: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f940: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
f950: 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
f960: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
f970: 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
f980: 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70  handler(Pager *p
f990: 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c  Pager, BusyHandl
f9a0: 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  er *pBusyHandler
f9b0: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  ){.  pPager->pBu
f9c0: 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73  syHandler = pBus
f9d0: 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a  yHandler;.}../*.
f9e0: 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72  ** Set the destr
f9f0: 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70  uctor for this p
fa00: 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
fa10: 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74  LL, the destruct
fa20: 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  or is called.** 
fa30: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
fa40: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68  ce count on each
fa50: 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65   page reaches ze
fa60: 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63  ro.  The destruc
fa70: 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  tor can.** be us
fa80: 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69  ed to clean up i
fa90: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
faa0: 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20  e extra segment 
fab0: 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68  appended to each
fac0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
fad0: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e   destructor is n
fae0: 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72  ot called as a r
faf0: 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67  esult sqlite3Pag
fb00: 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20  erClose().  .** 
fb10: 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20  Destructors are 
fb20: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
fb30: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
fb40: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
fb50: 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72  te3PagerSetDestr
fb60: 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61  uctor(Pager *pPa
fb70: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73  ger, void (*xDes
fb80: 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29  c)(DbPage*,int))
fb90: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73  {.  pPager->xDes
fba0: 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b  tructor = xDesc;
fbb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
fbc0: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20  e reinitializer 
fbd0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
fbe0: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
fbf0: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a  e reinitializer.
fc00: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ** is called whe
fc10: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
fc20: 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65   a page in cache
fc30: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
fc40: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  its original.** 
fc50: 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c  value as a resul
fc60: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
fc70: 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67    The callback g
fc80: 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65  ives higher-leve
fc90: 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70  l code.** an opp
fca0: 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74  ortunity to rest
fcb0: 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65  ore the EXTRA se
fcc0: 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77  ction to agree w
fcd0: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
fce0: 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  .** page data..*
fcf0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
fd00: 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 50  gerSetReiniter(P
fd10: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
fd20: 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
fd30: 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  Page*,int)){.  p
fd40: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
fd50: 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
fd60: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67  *.** Set the pag
fd70: 65 20 73 69 7a 65 2e 20 20 52 65 74 75 72 6e 20  e size.  Return 
fd80: 74 68 65 20 6e 65 77 20 73 69 7a 65 2e 20 20 49  the new size.  I
fd90: 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65  f the suggest ne
fda0: 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69  w page.** size i
fdb0: 73 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c  s inappropriate,
fdc0: 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61   then an alterna
fdd0: 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69  tive page size i
fde0: 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e  s selected.** an
fdf0: 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  d returned..*/.i
fe00: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
fe10: 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
fe20: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70 61   *pPager, int pa
fe30: 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  geSize){.  asser
fe40: 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t( pageSize>=512
fe50: 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
fe60: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
fe70: 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ZE );.  if( !pPa
fe80: 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50  ger->memDb && pP
fe90: 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  ager->nRef==0 ){
fea0: 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
feb0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
fec0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
fed0: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
fee0: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
fef0: 20 3d 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f   = sqlite3Reallo
ff00: 63 4f 72 46 72 65 65 28 70 50 61 67 65 72 2d 3e  cOrFree(pPager->
ff10: 70 54 6d 70 53 70 61 63 65 2c 20 70 61 67 65 53  pTmpSpace, pageS
ff20: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ize);.  }.  retu
ff30: 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  rn pPager->pageS
ff40: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
ff50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
ff60: 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
ff70: 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
ff80: 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
ff90: 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
ffa0: 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
ffb0: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
ffc0: 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
ffd0: 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
ffe0: 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
fff0: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
10000 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
10010 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
10020 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
10030 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
10040 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
10050 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
10060 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
10070 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
10080 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
10090 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
100a0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
100b0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
100c0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
100d0 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
100e0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
100f0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
10100 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
10110 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
10120 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
10130 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
10140 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
10150 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
10160 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
10170 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
10180 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
10190 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
101a0 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
101b0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
101c0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
101d0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
101e0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
101f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
10200 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
10210 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
10220 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
10230 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
10240 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
10250 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e  nts to. .**.** N
10260 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
10270 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61   is done. The ra
10280 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20  tional for this 
10290 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
102a0 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65  ction .** may be
102b0 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20   called even if 
102c0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
102d0 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
102e0 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20  in a header. In 
102f0 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20  .** these cases 
10300 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
10310 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65  will return an e
10320 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74  rror, to which t
10330 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72  he correct .** r
10340 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65  esponse is to ze
10350 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74  ro the memory at
10360 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69   pDest and conti
10370 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20  nue.  A real IO 
10380 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70  error .** will p
10390 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20  resumably recur 
103a0 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70  and be picked up
103b0 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68   later (Todo: Th
103c0 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e  ink about this).
103d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
103e0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
103f0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
10400 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
10410 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
10420 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10430 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
10440 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69  Dest, 0, N);.  i
10450 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20  f( MEMDB==0 ){. 
10460 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
10470 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
10480 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  ;.    sqlite3OsS
10490 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
104a0 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  0);.    enable_s
104b0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
104c0 72 73 28 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  rs();.    IOTRAC
104d0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
104e0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
104f0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
10500 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
10510 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a  >fd, pDest, N);.
10520 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10530 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
10540 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
10550 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10560 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10570 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
10580 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
10590 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
105a0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
105b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
105c0 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a  * pPager. .**.**
105d0 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   If the PENDING_
105e0 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65  BYTE lies on the
105f0 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61   page directly a
10600 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
10610 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  the.** file, the
10620 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  n consider this 
10630 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65  page part of the
10640 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65   file too. For e
10650 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45  xample, if.** PE
10660 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79  NDING_BYTE is by
10670 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72  te 4096 (the fir
10680 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20  st byte of page 
10690 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  5) and the size 
106a0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  of the.** file i
106b0 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20  s 4096 bytes, 5 
106c0 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
106d0 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74  ead of 4..*/.int
106e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
106f0 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
10700 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  ager){.  i64 n;.
10710 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
10720 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
10730 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
10740 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
10750 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
10760 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
10770 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  >=0 ){.    n = p
10780 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
10790 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66   } else {.    if
107a0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ( (rc = sqlite3O
107b0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
107c0 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49  ->fd, &n))!=SQLI
107d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
107e0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
107f0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65  r, rc);.      re
10800 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
10810 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
10820 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
10830 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  ){.      n = 1;.
10840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10850 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61   n /= pPager->pa
10860 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  geSize;.    }.  
10870 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
10880 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
10890 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
108a0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20  r->dbSize = n;. 
108b0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
108c0 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ==(PENDING_BYTE/
108d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
108e0 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ) ){.    n++;.  
108f0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
10900 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10910 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f  _OMIT_MEMORYDB./
10920 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48  *.** Clear a PgH
10930 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a  istory block.*/.
10940 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
10950 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f  rHistory(PgHisto
10960 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71  ry *pHist){.  sq
10970 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
10980 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65  pOrig);.  sqlite
10990 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
109a0 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72  t);.  pHist->pOr
109b0 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d  ig = 0;.  pHist-
109c0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65  >pStmt = 0;.}.#e
109d0 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61  lse.#define clea
109e0 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64  rHistory(x).#end
109f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  if../*.** Forwar
10a00 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
10a10 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
10a20 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
10a30 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70  ../*.** Unlink p
10a40 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  Pg from it's has
10a50 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65  h chain. Also se
10a60 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
10a70 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61  r to 0 to indica
10a80 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  te.** that the p
10a90 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20  age is not part 
10aa0 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69  of any hash chai
10ab0 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  n. This is requi
10ac0 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a  red because the.
10ad0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ** sqlite3PagerM
10ae0 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e  ovepage() routin
10af0 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61  e can leave a pa
10b00 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e  ge in the .** pN
10b10 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65  extFree/pPrevFre
10b20 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e  e list that is n
10b30 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79  ot a part of any
10b40 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a   hash-chain..*/.
10b50 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
10b60 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65  nkHashChain(Page
10b70 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
10b80 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
10b90 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  g->pgno==0 ){.  
10ba0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
10bb0 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70  NextHash==0 && p
10bc0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  Pg->pPrevHash==0
10bd0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
10be0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
10bf0 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
10c00 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
10c10 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d  pPrevHash = pPg-
10c20 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a  >pPrevHash;.  }.
10c30 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
10c40 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65  Hash ){.    asse
10c50 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
10c60 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70  h[pPg->pgno & (p
10c70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d  Pager->nHash-1)]
10c80 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  !=pPg );.    pPg
10c90 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65  ->pPrevHash->pNe
10ca0 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e  xtHash = pPg->pN
10cb0 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65  extHash;.  }else
10cc0 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50  {.    int h = pP
10cd0 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65  g->pgno & (pPage
10ce0 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20  r->nHash-1);.   
10cf0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
10d00 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
10d10 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  sh;.  }.  if( ME
10d20 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  MDB ){.    clear
10d30 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f  History(PGHDR_TO
10d40 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
10d50 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  r));.  }.  pPg->
10d60 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d  pgno = 0;.  pPg-
10d70 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
10d80 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
10d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
10da0 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
10db0 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20   free list (the 
10dc0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
10dd0 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29  s where nRef==0)
10de0 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73  .** and from its
10df0 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   hash collision 
10e00 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
10e10 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65   void unlinkPage
10e20 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
10e30 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
10e40 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
10e50 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72  /* Keep the pFir
10e60 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72  stSynced pointer
10e70 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
10e80 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69   first synchroni
10e90 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66  zed page */.  if
10ea0 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70  ( pPg==pPager->p
10eb0 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
10ec0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
10ed0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
10ee0 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
10ef0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
10f00 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
10f10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
10f20 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
10f30 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
10f40 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
10f50 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  t */.  if( pPg->
10f60 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
10f70 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
10f80 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
10f90 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
10fa0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
10fb0 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
10fc0 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
10fd0 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
10fe0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
10ff0 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
11000 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  xtFree ){.    pP
11010 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
11020 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
11030 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73  PrevFree;.  }els
11040 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
11050 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50  Pager->pLast==pP
11060 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
11070 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
11080 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70  revFree;.  }.  p
11090 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
110a0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
110b0 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b   0;..  /* Unlink
110c0 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68   from the pgno h
110d0 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75  ash table */.  u
110e0 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
110f0 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a  Pager, pPg);.}..
11100 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11110 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72  ne is used to tr
11120 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65  uncate the cache
11130 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
11140 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65 64  .** is truncated
11150 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68 65  .  Drop from the
11160 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65 73   cache all pages
11170 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a   whose pgno is.*
11180 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  * larger than pP
11190 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64  ager->dbSize and
111a0 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64   is unreferenced
111b0 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
111c0 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20  ed pages larger 
111d0 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
111e0 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ize are zeroed..
111f0 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  **.** Actually, 
11200 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69  at the point thi
11210 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
11220 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62 65  led, it would be
11230 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
11240 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65  have a reference
11250 64 20 70 61 67 65 2e 20 20 42 75 74 20 72 61 74  d page.  But rat
11260 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65 0a  her than delete.
11270 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e 64  ** that page and
11280 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 75 62   guarantee a sub
11290 73 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c 74  sequent segfault
112a0 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74 74 65  , it seems bette
112b0 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20  r.** to zero it 
112c0 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77 65  and hope that we
112d0 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c   error out sanel
112e0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
112f0 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  d pager_truncate
11300 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50  _cache(Pager *pP
11310 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
11320 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70  pPg;.  PgHdr **p
11330 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a  pPg;.  int dbSiz
11340 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
11350 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70  ze;..  ppPg = &p
11360 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77  Pager->pAll;.  w
11370 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70  hile( (pPg = *pp
11380 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  Pg)!=0 ){.    if
11390 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53  ( pPg->pgno<=dbS
113a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50  ize ){.      ppP
113b0 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
113c0 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
113d0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b  ( pPg->nRef>0 ){
113e0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
113f0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
11400 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
11410 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70  eSize);.      pp
11420 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
11430 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  All;.    }else{.
11440 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50        *ppPg = pP
11450 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
11460 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46     IOTRACE(("PGF
11470 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  REE %p %d\n", pP
11480 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
11490 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
114a0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
114b0 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b  r_pgfree_count);
114c0 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67  .      unlinkPag
114d0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61  e(pPg);.      ma
114e0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
114f0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
11500 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
11510 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
11520 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
11530 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
11540 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20  ock on a file.  
11550 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
11560 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
11570 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65  lock.** is curre
11580 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
11590 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69  le.  Repeat unti
115a0 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
115b0 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66  ack returns.** f
115c0 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
115d0 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
115e0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
115f0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
11600 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
11610 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
11620 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
11630 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
11640 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
11650 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
11660 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
11670 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pe){.  int rc;..
11680 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
11690 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
116a0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
116b0 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
116c0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
116d0 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
116e0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
116f0 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
11700 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
11710 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
11720 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
11730 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
11740 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
11750 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
11760 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
11770 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
11780 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61  e unknown */.  a
11790 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
117a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
117b0 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  ED || pPager->db
117c0 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20  Size<0 || MEMDB 
117d0 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
117e0 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70  ->state>=locktyp
117f0 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  e ){.    rc = SQ
11800 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
11810 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
11820 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
11830 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
11840 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d  locktype);.    }
11850 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
11860 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74 65  E_BUSY && sqlite
11870 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
11880 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
11890 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20  Handler) );.    
118a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
118b0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
118c0 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74  r->state = lockt
118d0 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ype;.      IOTRA
118e0 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
118f0 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b  n", pPager, lock
11900 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d  type)).    }.  }
11910 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11920 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
11930 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  the file to the 
11940 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
11950 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e  specified..*/.in
11960 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
11970 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
11980 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
11990 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
119a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
119b0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
119c0 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20  ED || MEMDB );. 
119d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
119e0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
119f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
11a00 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20  rCode ){.    rc 
11a10 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
11a20 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  e;.    return rc
11a30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
11a40 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61  e>=(unsigned)pPa
11a50 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
11a60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11a70 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d  _OK;.  }.  if( M
11a80 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
11a90 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
11aa0 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72  ge;.    pager_tr
11ab0 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
11ac0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
11ad0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11ae0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
11af0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  al(pPager);.  if
11b00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11b10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
11b20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
11b30 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
11b40 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
11b50 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
11b60 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ing. */.  rc = p
11b70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
11b80 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
11b90 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  IVE_LOCK);.  if(
11ba0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11bb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11bc0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67  .  }..  rc = pag
11bd0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
11be0 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72 65  er, nPage);.  re
11bf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11c00 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
11c10 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
11c20 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
11c30 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
11c40 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
11c50 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
11c60 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
11c70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
11c80 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
11c90 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
11ca0 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
11cb0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
11cc0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
11cd0 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
11ce0 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
11cf0 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
11d00 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
11d10 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
11d20 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
11d30 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
11d40 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
11d50 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
11d60 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
11d70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11d80 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
11d90 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
11da0 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
11db0 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
11dc0 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
11dd0 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
11de0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
11df0 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
11e00 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
11e10 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
11e20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
11e30 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
11e40 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
11e50 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
11e60 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
11e70 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23  ager *pPager){.#
11e80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11e90 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
11ea0 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c  EMENT.  /* A mal
11eb0 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  loc() cannot fai
11ec0 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65  l in sqlite3Thre
11ed0 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20  adData() as one 
11ee0 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f  or more calls to
11ef0 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20   .  ** malloc() 
11f00 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
11f10 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74  y been made by t
11f20 68 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72  his thread befor
11f30 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74  e it gets.  ** t
11f40 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68  o this point. Th
11f50 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72  is means the Thr
11f60 65 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76  eadData must hav
11f70 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  e been allocated
11f80 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f   already.  ** so
11f90 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61   that ThreadData
11fa0 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73  .nAlloc can be s
11fb0 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61  et..  */.  Threa
11fc0 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71  dData *pTsd = sq
11fd0 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
11fe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
11ff0 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
12000 20 70 54 73 64 20 26 26 20 70 54 73 64 2d 3e 6e   pTsd && pTsd->n
12010 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a  Alloc );.#endif.
12020 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
12030 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
12040 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ;.  pPager->errC
12050 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ode = 0;.  pPage
12060 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
12070 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65   = 0;.  pager_re
12080 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  set(pPager);.  p
12090 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
120a0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
120b0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
120c0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
120d0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c   PAGERTRACE2("CL
120e0 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
120f0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49  ID(pPager));.  I
12100 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
12110 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
12120 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12130 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61  >errCode || (pPa
12140 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
12150 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
12160 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20  tmtOpen==0) );. 
12170 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
12180 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
12190 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
121a0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
121b0 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
121c0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
121d0 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  l);.  if( pPager
121e0 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
121f0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12200 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  (&pPager->stfd);
12210 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
12220 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66  Close(&pPager->f
12230 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69  d);.  /* Temp fi
12240 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  les are automati
12250 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79  cally deleted by
12260 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28   the OS.  ** if(
12270 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
12280 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69  e ){.  **   sqli
12290 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
122a0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
122b0 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66    ** }.  */..#if
122c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
122d0 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
122e0 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ENT.  /* Remove 
122f0 74 68 65 20 70 61 67 65 72 20 66 72 6f 6d 20 74  the pager from t
12300 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  he linked list o
12310 66 20 70 61 67 65 72 73 20 73 74 61 72 74 69 6e  f pagers startin
12320 67 20 61 74 20 0a 20 20 2a 2a 20 54 68 72 65 61  g at .  ** Threa
12330 64 44 61 74 61 2e 70 50 61 67 65 72 20 69 66 20  dData.pPager if 
12340 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e  memory-managemen
12350 74 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20  t is enabled..  
12360 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d  */.  if( pPager=
12370 3d 70 54 73 64 2d 3e 70 50 61 67 65 72 20 29 7b  =pTsd->pPager ){
12380 0a 20 20 20 20 70 54 73 64 2d 3e 70 50 61 67 65  .    pTsd->pPage
12390 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  r = pPager->pNex
123a0 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
123b0 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20  Pager *pTmp;.   
123c0 20 66 6f 72 28 70 54 6d 70 20 3d 20 70 54 73 64   for(pTmp = pTsd
123d0 2d 3e 70 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e  ->pPager; pTmp->
123e0 70 4e 65 78 74 21 3d 70 50 61 67 65 72 3b 20 70  pNext!=pPager; p
123f0 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29  Tmp=pTmp->pNext)
12400 7b 7d 0a 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65  {}.    pTmp->pNe
12410 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65  xt = pPager->pNe
12420 78 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  xt;.  }.#endif. 
12430 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
12440 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71  er->aHash);.  sq
12450 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
12460 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73  >pTmpSpace);.  s
12470 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
12480 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12490 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
124a0 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
124b0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67  number for the g
124c0 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a  iven page data..
124d0 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
124e0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
124f0 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74  bPage *p){.  ret
12500 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a  urn p->pgno;.}..
12510 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72  /*.** The page_r
12520 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ef() function in
12530 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66  crements the ref
12540 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
12550 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74   a page..** If t
12560 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
12570 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
12580 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65  list (the refere
12590 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
125a0 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76  o) then.** remov
125b0 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72  e it from the fr
125c0 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  eelist..**.** Fo
125d0 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65  r non-test syste
125e0 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69  ms, page_ref() i
125f0 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63  s a macro that c
12600 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29  alls _page_ref()
12610 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68  .** online of th
12620 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
12630 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20  t is zero.  For 
12640 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
12650 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61  ge_ref().** is a
12660 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73   real function s
12670 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65  o that we can se
12680 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e  t breakpoints an
12690 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73  d trace it..*/.s
126a0 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65  tatic void _page
126b0 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
126c0 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  {.  if( pPg->nRe
126d0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
126e0 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
126f0 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
12700 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74  list.  Remove it
12710 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
12720 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ==pPg->pPager->p
12730 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
12740 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20       PgHdr *p = 
12750 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
12760 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26        while( p &
12770 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  & p->needSync ){
12780 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65   p = p->pNextFre
12790 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e  e; }.      pPg->
127a0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
127b0 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  nced = p;.    }.
127c0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
127d0 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
127e0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
127f0 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
12800 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
12810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
12820 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
12830 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
12840 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
12850 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
12860 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  ){.      pPg->pN
12870 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
12880 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
12890 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
128a0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
128b0 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
128c0 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
128d0 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
128e0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
128f0 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52  pPg->nRef++;.  R
12900 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23  EFINFO(pPg);.}.#
12910 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
12920 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
12930 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20   page_ref(PgHdr 
12940 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70  *pPg){.    if( p
12950 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
12960 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70       _page_ref(p
12970 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
12980 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b        pPg->nRef+
12990 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f  +;.      REFINFO
129a0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
129b0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
129c0 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28  page_ref(P)   ((
129d0 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67  P)->nRef==0?_pag
129e0 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28  e_ref(P):(void)(
129f0 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64  P)->nRef++).#end
12a00 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
12a10 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
12a20 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
12a30 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70  ge.  The input p
12a40 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72  ointer is.** a r
12a50 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
12a60 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e  page data..*/.in
12a70 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
12a80 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
12a90 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
12aa0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12ab0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
12ac0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
12ad0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
12ae0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
12af0 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
12b00 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
12b10 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
12b20 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
12b30 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
12b40 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
12b50 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
12b60 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
12b70 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
12b80 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
12b90 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
12ba0 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
12bb0 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
12bc0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
12bd0 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
12be0 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
12bf0 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
12c00 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
12c10 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
12c20 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
12c30 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
12c40 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
12c50 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
12c60 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
12c70 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
12c80 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
12c90 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
12ca0 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
12cb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
12cc0 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
12cd0 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
12ce0 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
12cf0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
12d00 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
12d10 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
12d20 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
12d30 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
12d40 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
12d50 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
12d60 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
12d70 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
12d80 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
12d90 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
12da0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
12db0 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
12dc0 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
12dd0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
12de0 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
12df0 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
12e00 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
12e10 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
12e20 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
12e30 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
12e40 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  o sync occurs..*
12e50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12e60 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65  e clears the nee
12e70 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65  dSync field of e
12e80 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e  very page curren
12e90 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d  t held in.** mem
12ea0 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
12eb0 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
12ec0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
12ed0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
12ee0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12ef0 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  K;..  /* Sync th
12f00 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
12f10 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
12f20 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
12f30 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
12f40 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
12f50 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
12f60 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
12f70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
12f80 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66  edSync ){.    if
12f90 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
12fa0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ile ){.      ass
12fb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
12fc0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
12fd0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
12fe0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
12ff0 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
13000 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
13010 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
13020 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
13030 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
13040 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
13050 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
13060 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13070 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
13080 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
13090 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
130a0 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
130b0 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
130c0 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
130d0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
130e0 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
130f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
13100 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
13110 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20      i64 jSz;.   
13120 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13130 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
13140 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a  er->jfd, &jSz);.
13150 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
13160 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
13170 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13180 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13190 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20  f==jSz );.      
131a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  }.#endif.      {
131b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
131c0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
131d0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
131e0 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
131f0 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
13200 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
13210 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
13220 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
13230 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
13240 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
13250 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
13260 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
13270 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
13280 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
13290 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
132a0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
132b0 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20 20  lback. .        
132c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
132d0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
132e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
132f0 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a  ERTRACE2("SYNC j
13300 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
13310 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
13320 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
13330 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
13340 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
13350 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13360 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
13370 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
13380 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
13390 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
133a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
133b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
133c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20  (pPager->jfd,.  
133d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133e0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
133f0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
13400 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
13410 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ic));.        if
13420 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
13430 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
13440 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
13450 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a   %d\n", pPager,.
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13470 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13480 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
13490 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29  ournalMagic), 4)
134a0 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ).        rc = w
134b0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
134c0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
134d0 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69  nRec);.        i
134e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
134f0 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  c;..        rc =
13500 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
13510 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
13520 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
13530 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
13540 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
13550 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52     }.      PAGER
13560 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
13570 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
13580 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
13590 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
135a0 22 4a 53 59 4e 43 20 25 64 5c 6e 22 2c 20 70 50  "JSYNC %d\n", pP
135b0 61 67 65 72 29 29 0a 20 20 20 20 20 20 72 63 20  ager)).      rc 
135c0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
135d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
135e0 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29  ger->full_fsync)
135f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
13600 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
13610 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
13620 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
13630 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
13640 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
13650 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
13660 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
13670 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
13680 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
13690 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
136a0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
136b0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
136c0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
136d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
136e0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
136f0 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
13700 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  irst;.  }..#ifnd
13710 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
13720 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
13730 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
13740 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
13750 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
13760 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
13770 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
13780 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
13790 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
137a0 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
137b0 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
137c0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
137d0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
137e0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
137f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13800 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
13810 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
13820 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
13830 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
13840 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d  r->pFirst );.  }
13850 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
13860 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
13870 65 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f  erge two lists o
13880 66 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  f pages connecte
13890 64 20 62 79 20 70 44 69 72 74 79 20 61 6e 64 20  d by pDirty and 
138a0 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a  in pgno order..*
138b0 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69  * Do not both fi
138c0 78 69 6e 67 20 74 68 65 20 70 50 72 65 76 44 69  xing the pPrevDi
138d0 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f  rty pointers..*/
138e0 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 6d  .static PgHdr *m
138f0 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 50 67  erge_pagelist(Pg
13900 48 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20 2a  Hdr *pA, PgHdr *
13910 70 42 29 7b 0a 20 20 50 67 48 64 72 20 72 65 73  pB){.  PgHdr res
13920 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70  ult, *pTail;.  p
13930 54 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a  Tail = &result;.
13940 20 20 77 68 69 6c 65 28 20 70 41 20 26 26 20 70    while( pA && p
13950 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  B ){.    if( pA-
13960 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29  >pgno<pB->pgno )
13970 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70  {.      pTail->p
13980 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 20 20  Dirty = pA;.    
13990 20 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20    pTail = pA;.  
139a0 20 20 20 20 70 41 20 3d 20 70 41 2d 3e 70 44 69      pA = pA->pDi
139b0 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rty;.    }else{.
139c0 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69        pTail->pDi
139d0 72 74 79 20 3d 20 70 42 3b 0a 20 20 20 20 20 20  rty = pB;.      
139e0 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20  pTail = pB;.    
139f0 20 20 70 42 20 3d 20 70 42 2d 3e 70 44 69 72 74    pB = pB->pDirt
13a00 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  y;.    }.  }.  i
13a10 66 28 20 70 41 20 29 7b 0a 20 20 20 20 70 54 61  f( pA ){.    pTa
13a20 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b  il->pDirty = pA;
13a30 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 20  .  }else if( pB 
13a40 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  ){.    pTail->pD
13a50 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c  irty = pB;.  }el
13a60 73 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70  se{.    pTail->p
13a70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  Dirty = 0;.  }. 
13a80 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 70   return result.p
13a90 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Dirty;.}../*.** 
13aa0 53 6f 72 74 20 74 68 65 20 6c 69 73 74 20 6f 66  Sort the list of
13ab0 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64   pages in accend
13ac0 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 67 6e  ing order by pgn
13ad0 6f 2e 20 20 50 61 67 65 73 20 61 72 65 0a 2a 2a  o.  Pages are.**
13ae0 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44   connected by pD
13af0 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 20 20  irty pointers.  
13b00 54 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70  The pPrevDirty p
13b10 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20 63  ointers are.** c
13b20 6f 72 72 75 70 74 65 64 20 62 79 20 74 68 69 73  orrupted by this
13b30 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e   sort..*/.#defin
13b40 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f  e N_SORT_BUCKET_
13b50 41 4c 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e 65  ALLOC 25.#define
13b60 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 20   N_SORT_BUCKET  
13b70 20 20 20 20 20 32 35 0a 23 69 66 64 65 66 20 53       25.#ifdef S
13b80 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
13b90 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e   sqlite3_pager_n
13ba0 5f 73 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20 30  _sort_bucket = 0
13bb0 3b 0a 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52  ;.  #undef N_SOR
13bc0 54 5f 42 55 43 4b 45 54 0a 20 20 23 64 65 66 69  T_BUCKET.  #defi
13bd0 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  ne N_SORT_BUCKET
13be0 20 5c 0a 20 20 20 28 73 71 6c 69 74 65 33 5f 70   \.   (sqlite3_p
13bf0 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
13c00 65 74 3f 73 71 6c 69 74 65 33 5f 70 61 67 65 72  et?sqlite3_pager
13c10 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e  _n_sort_bucket:N
13c20 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
13c30 4f 43 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  OC).#endif.stati
13c40 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61  c PgHdr *sort_pa
13c50 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49  gelist(PgHdr *pI
13c60 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e  n){.  PgHdr *a[N
13c70 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
13c80 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69  OC], *p;.  int i
13c90 3b 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c  ;.  memset(a, 0,
13ca0 20 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77   sizeof(a));.  w
13cb0 68 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20  hile( pIn ){.   
13cc0 20 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49   p = pIn;.    pI
13cd0 6e 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  n = p->pDirty;. 
13ce0 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30     p->pDirty = 0
13cf0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
13d00 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31  <N_SORT_BUCKET-1
13d10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
13d20 28 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  ( a[i]==0 ){.   
13d30 20 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20       a[i] = p;. 
13d40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13d50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13d60 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67     p = merge_pag
13d70 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a  elist(a[i], p);.
13d80 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30          a[i] = 0
13d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13da0 20 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52      if( i==N_SOR
13db0 54 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20  T_BUCKET-1 ){.  
13dc0 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a      /* Coverage:
13dd0 20 54 6f 20 67 65 74 20 68 65 72 65 2c 20 74 68   To get here, th
13de0 65 72 65 20 6e 65 65 64 20 74 6f 20 62 65 20 32  ere need to be 2
13df0 5e 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29  ^(N_SORT_BUCKET)
13e00 20 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65   .      ** eleme
13e10 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74  nts in the input
13e20 20 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 70   list. This is p
13e30 6f 73 73 69 62 6c 65 2c 20 62 75 74 20 69 6d 70  ossible, but imp
13e40 72 61 63 74 69 63 61 6c 2e 0a 20 20 20 20 20 20  ractical..      
13e50 2a 2a 20 54 65 73 74 69 6e 67 20 74 68 69 73 20  ** Testing this 
13e60 6c 69 6e 65 20 69 73 20 74 68 65 20 70 6f 69 6e  line is the poin
13e70 74 20 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72 69  t of global vari
13e80 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 71  able.      ** sq
13e90 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
13ea0 72 74 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20 20  rt_bucket..     
13eb0 20 2a 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d   */.      a[i] =
13ec0 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
13ed0 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  a[i], p);.    }.
13ee0 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a    }.  p = a[0];.
13ef0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53    for(i=1; i<N_S
13f00 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29  ORT_BUCKET; i++)
13f10 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f  {.    p = merge_
13f20 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d  pagelist(p, a[i]
13f30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
13f40 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
13f50 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65  n a list of page
13f60 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  s (connected by 
13f70 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
13f80 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a   pointer) write.
13f90 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20  ** every one of 
13fa0 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20  those pages out 
13fb0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13fc0 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68  file and mark th
13fd0 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65  em all.** as cle
13fe0 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
13ff0 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
14000 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
14010 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
14020 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
14030 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
14040 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
14050 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
14060 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
14070 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
14080 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
14090 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
140a0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
140b0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
140c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
140d0 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
140e0 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
140f0 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
14100 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74  ing.  ** calls t
14110 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  o sqlite3OsLock(
14120 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ) are no-ops..  
14130 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
14140 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
14150 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
14160 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
14170 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
14180 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
14190 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
141a0 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
141b0 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
141c0 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
141d0 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
141e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
141f0 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
14200 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
14210 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
14220 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
14230 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
14240 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
14250 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
14260 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
14270 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
14280 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
14290 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
142a0 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
142b0 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
142c0 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
142d0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
142e0 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
142f0 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
14300 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
14310 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
14320 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
14330 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
14340 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
14350 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
14360 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
14370 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
14380 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
14390 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
143a0 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
143b0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
143c0 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
143d0 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
143e0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
143f0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
14400 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
14410 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
14420 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14430 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
14440 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f  .  pList = sort_
14450 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b  pagelist(pList);
14460 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
14470 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
14480 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20  List->dirty );. 
14490 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
144a0 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
144b0 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  , (pList->pgno-1
144c0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
144d0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
144e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
144f0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ;.    /* If ther
14500 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
14510 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
14520 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
14530 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
14540 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
14550 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
14560 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
14570 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61  runcate() was ca
14580 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
14590 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
145a0 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
145b0 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
145c0 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
145d0 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
145e0 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
145f0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
14600 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
14610 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
14620 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  e ){.      char 
14630 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28  *pData = CODEC2(
14640 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
14650 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c  _DATA(pList), pL
14660 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20  ist->pgno, 6);. 
14670 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
14680 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
14690 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
146a0 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
146b0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  gno);.      IOTR
146c0 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
146d0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c  d\n", pPager, pL
146e0 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ist->pgno));.   
146f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14700 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
14710 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
14720 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
14730 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
14740 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
14750 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
14760 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
14770 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
14780 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
14790 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
147a0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
147b0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
147c0 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
147d0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
147e0 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
147f0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
14800 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
14810 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
14820 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
14830 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
14840 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
14850 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pgno);.    }.#en
14860 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29  dif.    if( rc )
14870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14880 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30  pList->dirty = 0
14890 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
148a0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
148b0 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
148c0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
148d0 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
148e0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
148f0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
14900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14910 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
14920 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
14930 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
14940 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
14950 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
14960 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
14970 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
14980 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
14990 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
149a0 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
149b0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
149c0 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
149d0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
149e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
149f0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
14a00 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
14a10 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
14a20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
14a30 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
14a40 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
14a50 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
14a60 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
14a70 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
14a80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
14a90 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
14aa0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14ab0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
14ac0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
14ad0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
14ae0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
14af0 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
14b00 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
14b10 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
14b20 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
14b30 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
14b40 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
14b50 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
14b60 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
14b70 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75    if( !pPager->u
14b80 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75  seJournal ) retu
14b90 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
14ba0 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
14bb0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
14bc0 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  l) ){.    return
14bd0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
14be0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
14bf0 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
14c00 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75  >fd) ){.    retu
14c10 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
14c20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
14c30 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30  count(pPager)==0
14c40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
14c50 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
14c60 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72  zJournal);.    r
14c70 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
14c80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
14c90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79    }.}../*.** Try
14ca0 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
14cb0 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
14cc0 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65  t can be recycle
14cd0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d. .**.** This r
14ce0 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72  outine may retur
14cf0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  n SQLITE_IOERR, 
14d00 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53  SQLITE_FULL or S
14d10 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a  QLITE_OK. It .**
14d20 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68   does not set th
14d30 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  e pPager->errCod
14d40 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
14d50 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
14d60 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70  recycle(Pager *p
14d70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f  Pager, int syncO
14d80 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29  k, PgHdr **ppPg)
14d90 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
14da0 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20    *ppPg = 0;..  
14db0 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29 3b 0a  assert(!MEMDB);.
14dc0 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67  .  /* Find a pag
14dd0 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54  e to recycle.  T
14de0 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ry to locate a p
14df0 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
14e00 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75  t.  ** require u
14e10 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63  s to do an fsync
14e20 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  () on the journa
14e30 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  l..  */.  pPg = 
14e40 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
14e50 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  nced;..  /* If w
14e60 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64  e could not find
14e70 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65   a page that doe
14e80 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e  s not require an
14e90 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e   fsync().  ** on
14ea0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
14eb0 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65  e then fsync the
14ec0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
14ed0 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76  This is a.  ** v
14ee0 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69  ery slow operati
14ef0 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68  on, so we work h
14f00 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e  ard to avoid it.
14f10 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a    But sometimes.
14f20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65    ** it can't be
14f30 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20   helped..  */.  
14f40 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50  if( pPg==0 && pP
14f50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20  ager->pFirst && 
14f60 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42  syncOk && !MEMDB
14f70 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
14f80 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
14f90 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
14fa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
14fb0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
14fc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
14fd0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f  lSync ){.      /
14fe0 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
14ff0 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20  c mode, write a 
15000 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  new journal head
15010 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  er into the.    
15020 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
15030 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  e. This is done 
15040 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f  to avoid ever mo
15050 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61  difying a journa
15060 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65  l.      ** heade
15070 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76  r that is involv
15080 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ed in the rollba
15090 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  ck of pages that
150a0 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61   have.      ** a
150b0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
150c0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
150d0 61 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65  ase (in case the
150e0 20 68 65 61 64 65 72 20 69 73 0a 20 20 20 20 20   header is.     
150f0 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e   ** trashed when
15100 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
15110 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20  is updated)..   
15120 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67     */.      pPag
15130 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
15140 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
15150 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e  er->journalOff >
15160 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65   0 );.      asse
15170 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
15180 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
15190 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
151a0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
151b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
151c0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
151d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
151e0 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50    }.    pPg = pP
151f0 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
15200 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  }.  if( pPg==0 )
15210 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15220 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61  ITE_OK;.  }..  a
15230 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
15240 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69  ==0 );..  /* Wri
15250 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  te the page to t
15260 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15270 20 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e   if it is dirty.
15280 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
15290 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 6e  >dirty ){.    in
152a0 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  t rc;.    assert
152b0 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
152c0 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c  =0 );.    makeCl
152d0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50  ean(pPg);.    pP
152e0 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
152f0 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
15300 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  0;.    rc = page
15310 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
15320 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66 28  ( pPg );.    if(
15330 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15340 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
15350 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  c;.    }.  }.  a
15360 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
15370 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  y==0 );..  /* If
15380 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
15390 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61   recycling is ma
153a0 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
153b0 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a  llback, then.  *
153c0 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c  * set the global
153d0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
153e0 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62  flag, thus disab
153f0 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71  ling the.  ** sq
15400 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
15410 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a  llback() optimiz
15420 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65  ation for the re
15430 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73  st of this trans
15440 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20  action..  ** It 
15450 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
15460 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20  do this because 
15470 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20  the page marked 
15480 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20  alwaysRollback. 
15490 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c   ** might be rel
154a0 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72  oaded at a later
154b0 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61   time but at tha
154c0 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74  t point we won't
154d0 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
154e0 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65  hat is was marke
154f0 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
15500 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
15510 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73  at all pages mus
15520 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64  t.  ** be marked
15530 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   as alwaysRollba
15540 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20  ck from here on 
15550 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  out..  */.  if( 
15560 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
15570 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  ack ){.    IOTRA
15580 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c  CE(("ALWAYS_ROLL
15590 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  BACK %p\n", pPag
155a0 65 72 29 29 0a 20 20 20 20 70 50 61 67 65 72 2d  er)).    pPager-
155b0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
155c0 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  = 1;.  }..  /* U
155d0 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61  nlink the old pa
155e0 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
155f0 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61   list and the ha
15600 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20  sh table.  */.  
15610 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
15620 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
15630 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70  pgno==0 );..  *p
15640 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  pPg = pPg;.  ret
15650 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15660 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
15670 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
15680 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75  to free superflu
15690 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  ous dynamically 
156a0 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
156b0 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20  .** held by the 
156c0 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65  pager system. Me
156d0 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61  mory in use by a
156e0 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20  ny SQLite pager 
156f0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
15700 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
15710 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65  ad may be sqlite
15720 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20  Free()ed..**.** 
15730 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62  nReq is the numb
15740 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  er of bytes of m
15750 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20  emory required. 
15760 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68  Once this much h
15770 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61  as.** been relea
15780 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  sed, the functio
15790 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65 67  n returns. A neg
157a0 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72 20  ative value for 
157b0 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72  nReq means.** fr
157c0 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
157d0 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20 54  y as possible. T
157e0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
157f0 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
15800 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73  ber .** of bytes
15810 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61   of memory relea
15820 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  sed..*/.#ifdef S
15830 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
15840 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69  ORY_MANAGEMENT.i
15850 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
15860 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74  eleaseMemory(int
15870 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20   nReq){.  const 
15880 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
15890 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  ro = sqlite3Thre
158a0 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
158b0 3b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65  ;.  int nRelease
158c0 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  d = 0;.  int i;.
158d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 68 65  .  /* If the the
158e0 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73   global mutex is
158f0 20 68 65 6c 64 2c 20 74 68 69 73 20 73 75 62 72   held, this subr
15900 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 20 61  outine becomes a
15910 0a 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f  .  ** o-op; zero
15920 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
15930 20 61 72 65 20 66 72 65 65 64 2e 20 20 54 68 69   are freed.  Thi
15940 73 20 69 73 20 62 65 63 61 75 73 65 0a 20 20 2a  s is because.  *
15950 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f  * some of the co
15960 64 65 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  de invoked by th
15970 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
15980 61 6c 73 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f  also.  ** try to
15990 20 6f 62 74 61 69 6e 20 74 68 65 20 6d 75 74 65   obtain the mute
159a0 78 2c 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  x, resulting in 
159b0 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f  a deadlock..  */
159c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
159d0 49 6e 4d 75 74 65 78 28 30 29 20 29 7b 0a 20 20  InMutex(0) ){.  
159e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
159f0 0a 20 20 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20  .  /* Outermost 
15a00 6c 6f 6f 70 20 72 75 6e 73 20 66 6f 72 20 61 74  loop runs for at
15a10 20 6d 6f 73 74 20 74 77 6f 20 69 74 65 72 61 74   most two iterat
15a20 69 6f 6e 73 2e 20 46 69 72 73 74 20 69 74 65 72  ions. First iter
15a30 61 74 69 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72  ation we.  ** tr
15a40 79 20 74 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79  y to find memory
15a50 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 6c   that can be rel
15a60 65 61 73 65 64 20 77 69 74 68 6f 75 74 20 63 61  eased without ca
15a70 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 2e 20 53  lling fsync(). S
15a80 65 63 6f 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61  econd.  ** itera
15a90 74 69 6f 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79  tion (which only
15aa0 20 72 75 6e 73 20 69 66 20 74 68 65 20 66 69 72   runs if the fir
15ab0 73 74 20 66 61 69 6c 65 64 20 74 6f 20 66 72 65  st failed to fre
15ac0 65 20 6e 52 65 71 20 62 79 74 65 73 20 6f 66 0a  e nReq bytes of.
15ad0 20 20 2a 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20    ** memory) is 
15ae0 70 65 72 6d 69 74 74 65 64 20 74 6f 20 63 61 6c  permitted to cal
15af0 6c 20 66 73 79 6e 63 28 29 2e 20 54 68 69 73 20  l fsync(). This 
15b00 69 73 20 6f 66 20 63 6f 75 72 73 65 20 6d 75 63  is of course muc
15b10 68 20 6d 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70  h more .  ** exp
15b20 65 6e 73 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66  ensive..  */.  f
15b30 6f 72 28 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b  or(i=0; i<=1; i+
15b40 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70  +){..    /* Loop
15b50 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65   through all the
15b60 20 53 51 4c 69 74 65 20 70 61 67 65 72 73 20 6f   SQLite pagers o
15b70 70 65 6e 65 64 20 62 79 20 74 68 65 20 63 75 72  pened by the cur
15b80 72 65 6e 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a  rent thread. */.
15b90 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
15ba0 72 20 3d 20 70 54 73 64 72 6f 2d 3e 70 50 61 67  r = pTsdro->pPag
15bb0 65 72 3b 0a 20 20 20 20 66 6f 72 28 20 3b 20 70  er;.    for( ; p
15bc0 50 61 67 65 72 20 26 26 20 28 6e 52 65 71 3c 30  Pager && (nReq<0
15bd0 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52   || nReleased<nR
15be0 65 71 29 3b 20 70 50 61 67 65 72 3d 70 50 61 67  eq); pPager=pPag
15bf0 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
15c00 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
15c10 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
15c20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
15c30 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
15c40 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15c50 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 70 61 67   /* For each pag
15c60 65 72 2c 20 74 72 79 20 74 6f 20 66 72 65 65 20  er, try to free 
15c70 61 73 20 6d 61 6e 79 20 70 61 67 65 73 20 61 73  as many pages as
15c80 20 70 6f 73 73 69 62 6c 65 20 28 77 69 74 68 6f   possible (witho
15c90 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ut .      ** cal
15ca0 6c 69 6e 67 20 66 73 79 6e 63 28 29 20 69 66 20  ling fsync() if 
15cb0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
15cc0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
15cd0 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a 20 20  he outermost .  
15ce0 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20      ** loop)..  
15cf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69      */.      whi
15d00 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  le( SQLITE_OK==(
15d10 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63  rc = pager_recyc
15d20 6c 65 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  le(pPager, i, &p
15d30 50 67 29 29 20 26 26 20 70 50 67 29 20 7b 0a 20  Pg)) && pPg) {. 
15d40 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20         /* We've 
15d50 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20  found a page to 
15d60 66 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f  free. At this po
15d70 69 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73  int the page has
15d80 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 2a   been .        *
15d90 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  * removed from t
15da0 68 65 20 70 61 67 65 20 68 61 73 68 2d 74 61 62  he page hash-tab
15db0 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  le, free-list an
15dc0 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20  d synced-list . 
15dd0 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73         ** (pFirs
15de0 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20  tSynced). It is 
15df0 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c  still in the all
15e00 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69   pages (pAll) li
15e10 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  st. .        ** 
15e20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  Remove it from t
15e30 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20  his list before 
15e40 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 20  freeing..       
15e50 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
15e60 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50  odo: Check the P
15e70 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20  ager.pStmt list 
15e80 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
15e90 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20  s is Ok. It .   
15ea0 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
15eb0 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20   is though..    
15ec0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
15ed0 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  gHdr *pTmp;.    
15ee0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 20      assert( pPg 
15ef0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
15f00 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  Pg==pPager->pAll
15f10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70   ){.           p
15f20 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50  Pager->pAll = pP
15f30 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
15f40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15f50 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d        for( pTmp=
15f60 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54  pPager->pAll; pT
15f70 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50  mp->pNextAll!=pP
15f80 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  g; pTmp=pTmp->pN
15f90 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20  extAll ){}.     
15fa0 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74       pTmp->pNext
15fb0 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
15fc0 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  All;.        }. 
15fd0 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64         nReleased
15fe0 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53   += sqliteAllocS
15ff0 69 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ize(pPg);.      
16000 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46 52    IOTRACE(("PGFR
16010 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  EE %p %d\n", pPa
16020 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
16030 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f  ;.        PAGER_
16040 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
16050 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
16060 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16070 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Free(pPg);.     
16080 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
16090 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
160a0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72         /* An err
160b0 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73  or occured whils
160c0 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
160d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
160e0 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  r .        ** jo
160f0 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72  urnal in pager_r
16100 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72  ecycle(). The er
16110 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72  ror is not retur
16120 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20  ned to the .    
16130 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66      ** caller of
16140 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
16150 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68 65  Instead, set the
16160 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76   Pager.errCode v
16170 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  ariable..       
16180 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69   ** The error wi
16190 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
161a0 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 75  o the user (or u
161b0 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73  sers, in the cas
161c0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  e .        ** of
161d0 20 61 20 73 68 61 72 65 64 20 70 61 67 65 72 20   a shared pager 
161e0 63 61 63 68 65 29 20 6f 66 20 74 68 65 20 70 61  cache) of the pa
161f0 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ger for which th
16200 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e  e error occured.
16210 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
16220 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 26      assert( (rc&
16230 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
16240 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ERR || rc==SQLIT
16250 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  E_FULL );.      
16260 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16270 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
16280 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20  ESERVED );.     
16290 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
162a0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
162b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
162c0 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73 65   return nRelease
162d0 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  d;.}.#endif /* S
162e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
162f0 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a  ORY_MANAGEMENT *
16300 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  /../*.** Read th
16310 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
16320 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
16330 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
16340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
16350 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a  adDbPage(Pager *
16360 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
16370 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Pg, Pgno pgno){.
16380 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
16390 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a  rt( MEMDB==0 );.
163a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
163b0 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
163c0 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
163d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
163e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
163f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
16400 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
16410 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
16420 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a  R_TO_DATA(pPg),.
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
16450 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
16460 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
16470 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
16480 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
16490 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
164a0 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
164b0 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
164c0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
164d0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  );.  PAGERTRACE3
164e0 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
164f0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
16500 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
16510 6f 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  o);.  if( pgno==
16520 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1 ){.    memcpy(
16530 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
16540 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48 44  ers, &((u8*)PGHD
16550 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 5b  R_TO_DATA(pPg))[
16560 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  24],.           
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16590 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72     sizeof(pPager
165a0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
165b0 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
165c0 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
165d0 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67  TA(pPg), pPg->pg
165e0 6e 6f 2c 20 33 29 3b 0a 20 20 72 65 74 75 72 6e  no, 3);.  return
165f0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
16600 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16610 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
16620 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16630 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
16640 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
16650 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
16660 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
16670 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61  e shared lock ha
16680 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
16690 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73  n obtained, this
166a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
166b0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65  o-op..**.** Imme
166c0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
166d0 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72  taining the shar
166e0 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75  ed lock (if requ
166f0 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63  ired), this func
16700 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66  tion.** checks f
16710 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
16720 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73   file. If one is
16730 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67   found, an emerg
16740 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ency rollback.**
16750 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d   is performed im
16760 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  mediately..*/.st
16770 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68  atic int pagerSh
16780 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
16790 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
167a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
167b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
167c0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
167d0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45  K ){.    if( !ME
167e0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73  MDB ){.      ass
167f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
16800 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f==0 );.      if
16810 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
16820 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  dlock ){.       
16830 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
16840 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
16850 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
16860 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
16870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16880 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
16890 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
168a0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
168b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
168c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
168d0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
168e0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
168f0 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
16900 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
16910 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
16920 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
16930 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
16940 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
16950 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
16960 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
16970 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
16980 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 68    */.      if( h
16990 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
169a0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
169b0 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
169c0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
169d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
169e0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
169f0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d  is.        ** im
16a00 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
16a10 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
16a20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
16a30 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
16a40 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53         ** EXCLUS
16a50 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
16a60 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
16a70 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
16a80 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
16a90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
16aa0 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
16ab0 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
16ac0 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
16ad0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
16ae0 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
16af0 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
16b00 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
16b10 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20  olling it .     
16b20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20     ** back..    
16b30 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
16b40 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
16b50 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
16b60 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
16b70 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
16b80 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e          ** secon
16b90 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67  d process will g
16ba0 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
16bb0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
16bc0 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20   fail to.       
16bd0 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20   ** obtain it's 
16be0 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
16bf0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
16c00 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  se file..       
16c10 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
16c20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
16c30 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
16c40 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
16c50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16c60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16c70 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
16c80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
16c90 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
16ca0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
16cb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16cc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
16cd0 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
16ce0 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20 20 20  SIVE;. .        
16cf0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
16d00 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20  nal for reading 
16d10 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51  only.  Return SQ
16d20 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
16d30 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75       ** we are u
16d40 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  nable to open th
16d50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
16d60 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
16d70 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e      ** The journ
16d80 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
16d90 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
16da0 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a  ed itself.  The.
16db0 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
16dc0 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
16dd0 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65   open unless the
16de0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
16df0 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20  ile holds.      
16e00 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63    ** a write loc
16e10 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  k, so there is n
16e20 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20  ever any chance 
16e30 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20  of two or more. 
16e40 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
16e50 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ses opening the 
16e60 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73  journal at the s
16e70 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ame time..      
16e80 20 20 2a 2a 0a 09 2a 2a 20 4f 70 65 6e 20 74 68    **..** Open th
16e90 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
16ea0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
16eb0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
16ec0 20 69 6e 20 0a 09 2a 2a 20 65 78 63 6c 75 73 69   in ..** exclusi
16ed0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
16ee0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
16ef0 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
16f00 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  open and.       
16f10 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
16f20 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
16f30 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
16f40 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
16f50 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73  he.        ** Os
16f60 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20  Truncate() call 
16f70 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76  used in exclusiv
16f80 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c  e-access mode al
16f90 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  so requires.    
16fa0 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72      ** a read/wr
16fb0 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  ite file handle.
16fc0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
16fd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16fe0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 69 66  BUSY;.        if
16ff0 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  ( sqlite3OsFileE
17000 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
17010 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
17020 20 20 20 20 20 69 6e 74 20 72 6f 3b 0a 20 20 20       int ro;.   
17030 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
17040 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
17050 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
17060 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
17070 52 65 61 64 57 72 69 74 65 28 70 50 61 67 65 72  ReadWrite(pPager
17080 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
17090 67 65 72 2d 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a  ger->jfd, &ro);.
170a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
170b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
170c0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 29  || pPager->jfd )
170d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
170e0 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ro ){.          
170f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17100 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  SY;.            
17110 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
17120 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
17130 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17140 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
17150 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17160 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
17170 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
17180 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
17190 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
171a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
171b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
171c0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
171d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
171e0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
171f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
17200 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
17210 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
17220 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
17230 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
17240 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
17250 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
17260 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
17270 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
17280 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
17290 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ite.        ** l
172a0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
172b0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
172c0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
172d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
172e0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
172f0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
17300 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17310 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
17320 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
17330 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
17340 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
17350 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74  ert(pPager->stat
17360 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
17370 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
17380 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
17390 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
173a0 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
173b0 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b  ARED).        );
173c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
173d0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  if( pPager->pAll
173e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
173f0 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
17400 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
17410 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
17420 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
17430 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
17440 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
17450 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
17460 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
17470 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20          ** read 
17480 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
17490 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
174a0 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
174b0 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  base.        ** 
174c0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
174d0 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
174e0 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
174f0 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
17500 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
17510 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
17520 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
17530 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
17540 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
17550 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
17560 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  .        ** at o
17570 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
17580 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
17590 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
175a0 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
175b0 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
175c0 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
175d0 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
175e0 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
175f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68  e.        ** oth
17600 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
17610 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
17620 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
17630 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
17640 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
17650 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
17660 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
17670 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
17680 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
17690 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
176a0 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 20 20  not be .        
176b0 2a 2a 20 64 65 74 65 63 68 65 64 2e 20 20 54 68  ** deteched.  Th
176c0 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
176d0 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
176e0 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
176f0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  t.        ** it 
17700 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
17710 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
17720 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
17730 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
17740 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
17750 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17760 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17770 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
17780 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
17790 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  rCode ){.       
177a0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
177b0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
177c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
177d0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
177e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
177f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
17800 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 32  ek(pPager->fd, 2
17810 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  4);.          if
17820 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17830 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
17840 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17850 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17860 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
17870 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
17880 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
17890 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b  of(dbFileVers));
178a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
178b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
178c0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
178d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
178e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
178f0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  {.          mems
17900 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
17910 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
17920 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ers));.        }
17930 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65  ..        if( me
17940 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
17950 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
17960 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
17970 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
17980 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72           pager_r
17990 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
179a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
179b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
179c0 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
179d0 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
179e0 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f  r->state<=PAGER_
179f0 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66  SHARED );.    if
17a00 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
17a10 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
17a20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
17a30 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
17a40 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RED;.    }.  }..
17a50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17a60 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
17a70 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e 20 20   PgHdr object.  
17a80 20 45 69 74 68 65 72 20 63 72 65 61 74 65 20 61   Either create a
17a90 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65 75 73   new one or reus
17aa0 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  e.** an existing
17ab0 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74   one that is not
17ac0 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75 73   otherwise in us
17ad0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50  e..**.** A new P
17ae0 67 48 64 72 20 73 74 72 75 63 74 75 72 65 20 69  gHdr structure i
17af0 73 20 63 72 65 61 74 65 64 20 69 66 20 61 6e 79  s created if any
17b00 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17b10 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a  g are.** true:.*
17b20 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65  *.**     (1)  We
17b30 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65 65 64   have not exceed
17b40 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61  ed our maximum a
17b50 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65 20 73  llocated cache s
17b60 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ize.**          
17b70 61 73 20 73 65 74 20 62 79 20 74 68 65 20 22 50  as set by the "P
17b80 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
17b90 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  " command..**.**
17ba0 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20       (2)  There 
17bb0 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20 50 67  are no unused Pg
17bc0 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76 61 69  Hdr objects avai
17bd0 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20 74 69  lable at this ti
17be0 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33  me..**.**     (3
17bf0 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  )  This is an in
17c00 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
17c10 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20  ..**.**     (4) 
17c20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 50 67   There are no Pg
17c30 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68 61 74  Hdr objects that
17c40 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
17c50 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  a journal.**    
17c60 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e 63 20        file sync 
17c70 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20 74 68  and a sync of th
17c80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
17c90 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  s currently.**  
17ca0 20 20 20 20 20 20 20 20 70 72 6f 68 69 62 69 74          prohibit
17cb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ed..**.** Otherw
17cc0 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20 65 78  ise, reuse an ex
17cd0 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20 20 49  isting PgHdr.  I
17ce0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
17cf0 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74  euse an.** exist
17d00 69 6e 67 20 50 67 48 64 72 20 69 66 20 61 6c 6c  ing PgHdr if all
17d10 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17d20 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
17d30 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68 61  *     (1)  We ha
17d40 76 65 20 72 65 61 63 68 65 64 20 6f 72 20 65 78  ve reached or ex
17d50 63 65 65 64 65 64 20 74 68 65 20 6d 61 78 69 6d  ceeded the maxim
17d60 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a  um cache size.**
17d70 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65            allowe
17d80 64 20 62 79 20 22 50 52 41 47 4d 41 20 63 61 63  d by "PRAGMA cac
17d90 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20  he_size"..**.** 
17da0 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20 69      (2)  There i
17db0 73 20 61 20 50 67 48 64 72 20 61 76 61 69 6c 61  s a PgHdr availa
17dc0 62 6c 65 20 77 69 74 68 20 50 67 48 64 72 2d 3e  ble with PgHdr->
17dd0 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20  nRef==0.**.**   
17de0 20 20 28 33 29 20 20 57 65 20 61 72 65 20 6e 6f    (3)  We are no
17df0 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  t in an in-memor
17e00 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  y database.**.**
17e10 20 20 20 20 20 28 34 29 20 20 45 69 74 68 65 72       (4)  Either
17e20 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 76 61   there is an ava
17e30 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74 68 61  ilable PgHdr tha
17e40 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a  t does not need.
17e50 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 62  **          to b
17e60 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  e synced to disk
17e70 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20 73 79   or else disk sy
17e80 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74  ncing is current
17e90 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61  ly.**          a
17ea0 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  llowed..*/.stati
17eb0 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63  c int pagerAlloc
17ec0 61 74 65 50 61 67 65 28 50 61 67 65 72 20 2a 70  atePage(Pager *p
17ed0 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70  Pager, PgHdr **p
17ee0 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
17ef0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
17f00 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20  Hdr *pPg;..  /* 
17f10 43 72 65 61 74 65 20 61 20 6e 65 77 20 50 67 48  Create a new PgH
17f20 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  dr if any of the
17f30 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73   four conditions
17f40 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61   defined .  ** a
17f50 62 6f 76 65 20 69 73 20 6d 65 74 3a 20 2a 2f 0a  bove is met: */.
17f60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
17f70 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61  age<pPager->mxPa
17f80 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  ge.   || pPager-
17f90 3e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c  >pFirst==0 .   |
17fa0 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70  | MEMDB.   || (p
17fb0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
17fc0 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ced==0 && pPager
17fd0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29  ->doNotSync).  )
17fe0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
17ff0 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d  ->nPage>=pPager-
18000 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  >nHash ){.      
18010 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73  pager_resize_has
18020 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a  h_table(pPager,.
18030 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
18040 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36  >nHash<256 ? 256
18050 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68   : pPager->nHash
18060 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *2);.      if( p
18070 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20  Pager->nHash==0 
18080 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18090 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
180a0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
180b0 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20  _allocate_out;. 
180c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
180d0 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pPg = sqliteMal
180e0 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
180f0 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70  pPg) + pPager->p
18100 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20  ageSize.        
18110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18120 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32      + sizeof(u32
18130 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
18140 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ra.             
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
18160 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67   MEMDB*sizeof(Pg
18170 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20  History) );.    
18180 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
18190 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
181a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
181b0 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
181c0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
181d0 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73  memset(pPg, 0, s
181e0 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20  izeof(*pPg));.  
181f0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
18200 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
18210 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
18220 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f  Pager), 0, sizeo
18230 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20  f(PgHistory));. 
18240 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
18250 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
18260 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c     pPg->pNextAll
18270 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b   = pPager->pAll;
18280 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  .    pPager->pAl
18290 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 61  l = pPg;.    pPa
182a0 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  ger->nPage++;.  
182b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
182c0 61 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78  age>pPager->nMax
182d0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Page ){.      as
182e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d  sert( pPager->nM
182f0 61 78 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d  axPage==(pPager-
18300 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20  >nPage-1) );.   
18310 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50     pPager->nMaxP
18320 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  age++;.    }.  }
18330 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63  else{.    /* Rec
18340 79 63 6c 65 20 61 6e 20 65 78 69 73 74 69 6e 67  ycle an existing
18350 20 70 61 67 65 20 77 69 74 68 20 61 20 7a 65 72   page with a zer
18360 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a  o ref-count. */.
18370 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72      rc = pager_r
18380 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 31  ecycle(pPager, 1
18390 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28  , &pPg);.    if(
183a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
183b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
183c0 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b  er_allocate_out;
183d0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
183e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
183f0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
18400 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 67 29  .    assert(pPg)
18410 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67 20 3d 20  ;.  }.  *ppPg = 
18420 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61 6c 6c 6f  pPg;..pager_allo
18430 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72 65 74 75  cate_out:.  retu
18440 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18450 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
18460 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
18470 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
18480 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
18490 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
184a0 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
184b0 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
184c0 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
184d0 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
184e0 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
184f0 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
18500 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
18510 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
18520 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
18530 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
18540 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
18550 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
18560 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
18570 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
18580 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
18590 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
185a0 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
185b0 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
185c0 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
185d0 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
185e0 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
185f0 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
18600 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
18610 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
18620 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
18630 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
18640 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
18650 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
18660 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
18670 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
18680 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
18690 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
186a0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
186b0 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
186c0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
186d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
186e0 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
186f0 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c  s routine and _l
18700 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
18710 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
18720 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
18730 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
18740 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
18750 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
18760 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
18770 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
18780 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
18790 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75  n whereas _looku
187a0 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
187b0 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
187c0 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
187d0 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
187e0 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
187f0 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
18800 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
18810 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
18820 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
18830 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
18840 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20  _lookup() never 
18850 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
18860 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
18870 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
18880 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
18890 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  s..**.** If noCo
188a0 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ntent is false, 
188b0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
188c0 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 72  s are actually r
188d0 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  ead from disk..*
188e0 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
188f0 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
18900 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
18910 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63  care about the c
18920 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
18930 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
18940 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 64  ime, so do not d
18950 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e 20 20  o a disk read.  
18960 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
18970 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  .** page content
18980 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20 42 75   with zeros.  Bu
18990 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63 74 20  t mark the fact 
189a0 74 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f 74  that we have not
189b0 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63 6f 6e   read the.** con
189c0 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e 67 20  tent by setting 
189d0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65  the PgHdr.needRe
189e0 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65 72 20  ad flag.  Later 
189f0 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c 69 74  on, if .** sqlit
18a00 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
18a10 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73  s called on this
18a20 20 70 61 67 65 2c 20 74 68 61 74 20 6d 65 61 6e   page, that mean
18a30 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 63 6f  s that the.** co
18a40 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64 20  ntent is needed 
18a50 61 6e 64 20 74 68 65 20 64 69 73 6b 20 72 65 61  and the disk rea
18a60 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
18a70 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
18a80 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
18a90 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65  rAcquire(.  Page
18aa0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
18ab0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
18ac0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
18ad0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
18ae0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
18af0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
18b00 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
18b10 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
18b20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
18b30 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
18b40 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  here */.  int no
18b50 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a  Content       /*
18b60 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72   Do not bother r
18b70 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66  eading content f
18b80 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65  rom disk if true
18b90 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a   */.){.  PgHdr *
18ba0 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pPg;.  int rc;..
18bb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18bc0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
18bd0 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  NLOCK || pPager-
18be0 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d  >nRef>0 || pgno=
18bf0 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  =1 );..  /* The 
18c00 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
18c10 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
18c20 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
18c30 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a  PT if a page.  *
18c40 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
18c50 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a   than this, or z
18c60 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65  ero, is requeste
18c70 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  d..  */.  if( pg
18c80 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
18c90 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20  O || pgno==0 || 
18ca0 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
18cb0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
18cc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18cd0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
18ce0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
18cf0 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68  re we have not h
18d00 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20  it any critical 
18d10 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20  errors..  */ .  
18d20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
18d30 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  0 );.  *ppPage =
18d40 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
18d50 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
18d60 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
18d70 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
18d80 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
18d90 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
18da0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
18db0 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63  e first page acc
18dc0 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20  essed, then get 
18dd0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20  a SHARED lock.  
18de0 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
18df0 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68  se file. pagerSh
18e00 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20  aredLock() is a 
18e10 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61  no-op if .  ** a
18e20 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69   database lock i
18e30 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a  s already held..
18e40 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
18e50 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67  rSharedLock(pPag
18e60 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
18e70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18e80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
18e90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18ea0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
18eb0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d  LOCK );..  pPg =
18ec0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
18ed0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
18ee0 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
18ef0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
18f00 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  d page is not in
18f10 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
18f20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78   */.    int nMax
18f30 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  ;.    int h;.   
18f40 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
18f50 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20  er->nMiss);.    
18f60 72 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61  rc = pagerAlloca
18f70 74 65 50 61 67 65 28 70 50 61 67 65 72 2c 20 26  tePage(pPager, &
18f80 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
18f90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18fa0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18fb0 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e      }..    pPg->
18fc0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
18fd0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
18fe0 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  || pgno>pPager->
18ff0 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  stmtSize );.    
19000 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
19010 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
19020 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  gno<=pPager->ori
19030 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
19040 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d   sqlite3CheckMem
19050 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ory(pPager->aInJ
19060 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b  ournal, pgno/8);
19070 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19080 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
19090 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  en );.      pPg-
190a0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50  >inJournal = (pP
190b0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
190c0 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
190d0 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20  pgno&7)))!=0;.  
190e0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
190f0 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
19100 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
19110 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
19120 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
19130 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
19140 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
19150 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20      pPg->nRef = 
19160 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70  1;.    REFINFO(p
19170 50 67 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72  Pg);..    pPager
19180 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66  ->nRef++;.    if
19190 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  ( pPager->nExtra
191a0 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
191b0 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
191c0 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20  A(pPg, pPager), 
191d0 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
191e0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  a);.    }.    nM
191f0 61 78 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ax = sqlite3Page
19200 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
19210 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  r);.    if( pPag
19220 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
19230 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
19240 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
19250 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
19260 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72  errCode;.      r
19270 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
19280 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
19290 20 74 68 65 20 70 61 67 65 20 77 69 74 68 20 64   the page with d
192a0 61 74 61 2c 20 65 69 74 68 65 72 20 62 79 20 72  ata, either by r
192b0 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
192c0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
192d0 66 69 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74  file, or by sett
192e0 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 70  ing the entire p
192f0 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20  age to zero..   
19300 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61 78   */.    if( nMax
19310 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45  <(int)pgno || ME
19320 4d 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e  MDB || (noConten
19330 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c  t && !pPager->al
19340 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b  waysRollback) ){
19350 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
19360 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
19370 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
19380 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50  eSize);.      pP
19390 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f  g->needRead = no
193a0 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67  Content && !pPag
193b0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
193c0 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ck;.      IOTRAC
193d0 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
193e0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
193f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19400 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
19410 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c  age(pPager, pPg,
19420 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66   pgno);.      if
19430 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19440 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
19450 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
19460 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  {.        pPg->p
19470 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  gno = 0;.       
19480 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
19490 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
194a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
194b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
194c0 2a 20 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20  * Link the page 
194d0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 68 61  into the page ha
194e0 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  sh table */.    
194f0 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
19500 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
19510 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
19520 30 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  0 );.    pPg->pN
19530 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
19540 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20  ->aHash[h];.    
19550 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
19560 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
19570 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
19580 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19590 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
195a0 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
195b0 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
195c0 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
195d0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69  = pPg;.    }..#i
195e0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
195f0 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
19600 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
19610 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
19620 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
19630 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
19640 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
19650 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
19660 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70   */.    assert(p
19670 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c  Pager->nRef>0 ||
19680 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50   pgno==1);.    P
19690 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
196a0 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 70 61 67  ->nHit);.    pag
196b0 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  e_ref(pPg);.  }.
196c0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b    *ppPage = pPg;
196d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
196e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
196f0 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
19700 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
19710 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
19720 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
19730 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
19740 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
19750 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
19760 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
19770 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
19780 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  not in cache..**
19790 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
197a0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
197b0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
197c0 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
197d0 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
197e0 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
197f0 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
19800 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
19810 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
19820 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
19830 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
19840 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
19850 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
19860 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
19870 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
19880 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
19890 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
198a0 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
198b0 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
198c0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
198d0 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
198e0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
198f0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
19900 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
19910 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
19920 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28  gno!=0 );..  if(
19930 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
19940 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
19950 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
19960 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61  ger->pAll || pPa
19970 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
19980 64 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  de );.    return
19990 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
199a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
199b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
199c0 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
199d0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
199e0 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72   }.  pPg = pager
199f0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
19a00 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
19a10 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
19a20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
19a30 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
19a40 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
19a50 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
19a60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
19a70 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
19a80 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
19a90 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
19aa0 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
19ab0 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
19ac0 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
19ad0 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
19ae0 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
19af0 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
19b00 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
19b10 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
19b20 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
19b30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
19b40 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20  gerUnref(DbPage 
19b50 2a 70 50 67 29 7b 0a 0a 20 20 2f 2a 20 44 65 63  *pPg){..  /* Dec
19b60 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
19b70 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74  ence count for t
19b80 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  his page.  */.  
19b90 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
19ba0 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  f>0 );.  pPg->nR
19bb0 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef--;.  REFINFO(
19bc0 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  pPg);..  CHECK_P
19bd0 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
19be0 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
19bf0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
19c00 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c   a page reach 0,
19c10 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64   call the.  ** d
19c20 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64  estructor and ad
19c30 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  d the page to th
19c40 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
19c50 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
19c60 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
19c70 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50   *pPager;.    pP
19c80 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
19c90 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
19ca0 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  xtFree = 0;.    
19cb0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
19cc0 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a   pPager->pLast;.
19cd0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
19ce0 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  t = pPg;.    if(
19cf0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
19d00 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
19d10 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
19d20 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65  ee = pPg;.    }e
19d30 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
19d40 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  r->pFirst = pPg;
19d50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
19d60 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
19d70 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
19d80 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20  tSynced==0 ){.  
19d90 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
19da0 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a  stSynced = pPg;.
19db0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
19dc0 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
19dd0 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
19de0 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70  r->xDestructor(p
19df0 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  Pg, pPager->page
19e00 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Size);.    }.  .
19e10 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20      /* When all 
19e20 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20  pages reach the 
19e30 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74  freelist, drop t
19e40 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f  he read lock fro
19e50 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  m.    ** the dat
19e60 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
19e70 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
19e80 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  Ref--;.    asser
19e90 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  t( pPager->nRef>
19ea0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
19eb0 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
19ec0 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75   (!pPager->exclu
19ed0 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
19ee0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
19ef0 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
19f00 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
19f10 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
19f20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
19f30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
19f40 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e  * Create a journ
19f50 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67  al file for pPag
19f60 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c  er.  There shoul
19f70 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  d already be a R
19f80 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58  ESERVED.** or EX
19f90 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
19fa0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19fb0 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
19fc0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
19fd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
19fe0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
19ff0 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ing.  Return an 
1a000 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72  error code and r
1a010 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72  elease the.** wr
1a020 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74  ite lock if anyt
1a030 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
1a040 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1a050 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1a060 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1a070 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
1a080 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
1a090 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a0a0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1a0b0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
1a0c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1a0d0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
1a0e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a0f0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
1a100 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a110 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
1a120 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
1a130 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1a140 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
1a150 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
1a160 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
1a170 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
1a180 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
1a190 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
1a1a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1a1b0 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66  OMEM;.    goto f
1a1c0 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
1a1d0 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20  urnal;.  }.  rc 
1a1e0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  = sqlite3OsOpenE
1a1f0 78 63 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d  xclusive(pPager-
1a200 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67  >zJournal, &pPag
1a210 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20  er->jfd,.       
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1a240 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 61  ->tempFile);.  a
1a250 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1a260 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
1a270 6a 66 64 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  jfd );.  pPager-
1a280 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
1a290 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
1a2a0 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
1a2b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
1a2c0 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
1a2d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1a2e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
1a2f0 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MEM ){.      sql
1a300 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
1a310 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
1a320 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 66      }.    goto f
1a330 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
1a340 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c  urnal;.  }.  sql
1a350 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e  ite3OsSetFullSyn
1a360 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
1a370 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e  Pager->full_fsyn
1a380 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53  c);.  sqlite3OsS
1a390 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65  etFullSync(pPage
1a3a0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 66  r->fd, pPager->f
1a3b0 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71  ull_fsync);.  sq
1a3c0 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63  lite3OsOpenDirec
1a3d0 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64  tory(pPager->jfd
1a3e0 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  , pPager->zDirec
1a3f0 74 6f 72 79 29 3b 0a 20 20 70 50 61 67 65 72 2d  tory);.  pPager-
1a400 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
1a410 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
1a420 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
1a430 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1a440 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
1a450 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1a460 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1a470 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  nRec = 0;.  if( 
1a480 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1a490 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
1a4a0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
1a4b0 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
1a4c0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
1a4d0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
1a4e0 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
1a4f0 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d  >dbSize;..  rc =
1a500 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
1a510 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
1a520 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
1a530 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c  oopen && rc==SQL
1a540 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1a550 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1a560 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29  tmtBegin(pPager)
1a570 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
1a580 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
1a590 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
1a5a0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1a5b0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
1a5c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1a5d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a5e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1a5f0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
1a600 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a610 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  ..failed_to_open
1a620 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69  _journal:.  sqli
1a630 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
1a640 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
1a650 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1a660 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
1a670 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
1a680 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
1a690 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1a6a0 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
1a6b0 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
1a6c0 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
1a6d0 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
1a6e0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
1a6f0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1a700 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65  seTwo() is calle
1a710 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
1a720 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1a730 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
1a740 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1a750 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  rClose() is call
1a760 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
1a770 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1a780 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20  is called to on 
1a790 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e  every outstandin
1a7a0 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  g page..**.** Th
1a7b0 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
1a7c0 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
1a7d0 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
1a7e0 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20  o any open page 
1a7f0 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
1a800 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e  se file.  Nothin
1a810 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20  g changes about 
1a820 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73  the page - it is
1a830 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a   used merely to.
1a840 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69  ** acquire a poi
1a850 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
1a860 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
1a870 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68  as proof that th
1a880 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64  ere is.** alread
1a890 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  y a read-lock on
1a8a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1a8b0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1a8c0 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1a8d0 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61  tes how much spa
1a8e0 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72  ce in bytes to r
1a8f0 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20  eserve for a.** 
1a900 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1a910 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20  ile-name at the 
1a920 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
1a930 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20  rnal when it is 
1a940 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  created..**.** A
1a950 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1a960 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20   opened if this 
1a970 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
1a980 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65  ry file.  For te
1a990 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73  mporary.** files
1a9a0 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66  , the opening of
1a9b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a9c0 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
1a9d0 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a  til there is an.
1a9e0 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  ** actual need t
1a9f0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  o write to the j
1aa00 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
1aa10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1aa20 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65   already reserve
1aa30 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74  d for writing, t
1aa40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1aa50 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
1aa60 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
1aa70 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65   go ahead and ge
1aa80 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
1aa90 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
1aaa0 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
1aab0 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e  nstead of waitin
1aac0 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74  g until we try t
1aad0 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  o flush the cach
1aae0 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61  e.  The.** exFla
1aaf0 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  g is ignored if 
1ab00 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1ab10 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
1ab20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1ab30 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67 65  agerBegin(DbPage
1ab40 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61   *pPg, int exFla
1ab50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1ab60 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1ab70 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
1ab80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1ab90 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
1aba0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1abb0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1abc0 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  _UNLOCK );.  if(
1abd0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1abe0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
1abf0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ac00 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
1ac10 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  0 );.    if( MEM
1ac20 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  DB ){.      pPag
1ac30 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1ac40 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
1ac50 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
1ac60 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1ac70 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73  dbSize;.    }els
1ac80 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
1ac90 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
1aca0 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44  er->fd, RESERVED
1acb0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
1acc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1acd0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1ace0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1acf0 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20  _RESERVED;.     
1ad00 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b     if( exFlag ){
1ad10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1ad20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
1ad30 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
1ad40 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
1ad50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1ad60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ad70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ad80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ad90 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1ada0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
1adb0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
1adc0 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE2("TRANSACTION
1add0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1ade0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
1adf0 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  if( pPager->useJ
1ae00 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65  ournal && !pPage
1ae10 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
1ae20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
1ae30 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
1ae40 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
1ae50 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1ae60 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1ae70 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d  lOpen && pPager-
1ae80 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
1ae90 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
1aea0 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70  ppens when the p
1aeb0 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c  ager was in excl
1aec0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
1aed0 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69  e last.    ** ti
1aee0 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77 72  me a (read or wr
1aef0 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e  ite) transaction
1af00 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
1af10 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20  y concluded.    
1af20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65  ** by this conne
1af30 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f  ction. Instead o
1af40 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a  f deleting the j
1af50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77  ournal file it w
1af60 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20  as .    ** kept 
1af70 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e 63 61 74  open and truncat
1af80 65 64 20 74 6f 20 30 20 62 79 74 65 73 2e 0a 20  ed to 0 bytes.. 
1af90 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1afa0 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  ( pPager->nRec==
1afb0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1afc0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1afd0 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
1afe0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1aff0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
1b000 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
1b010 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
1b020 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1b030 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
1b040 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
1b050 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
1b060 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1b070 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->aInJournal ){.
1b080 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b090 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
1b0a0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
1b0b0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
1b0c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1b0d0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
1b0e0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1b0f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
1b100 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1b110 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70  journalOpen || p
1b120 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b130 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  f>0 || rc!=SQLIT
1b140 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e  E_OK );.  return
1b150 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
1b160 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79 2e  ke a page dirty.
1b170 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79 20    Set its dirty 
1b180 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74 20  flag and add it 
1b190 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20  to the dirty.** 
1b1a0 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
1b1b0 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69  atic void makeDi
1b1c0 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b  rty(PgHdr *pPg){
1b1d0 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
1b1e0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  y==0 ){.    Page
1b1f0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1b200 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
1b210 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20  ->dirty = 1;.   
1b220 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70   pPg->pDirty = p
1b230 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20  Pager->pDirty;. 
1b240 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
1b250 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70  Dirty ){.      p
1b260 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70  Pager->pDirty->p
1b270 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b  PrevDirty = pPg;
1b280 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
1b290 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a  pPrevDirty = 0;.
1b2a0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
1b2b0 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a  ty = pPg;.  }.}.
1b2c0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61  ./*.** Make a pa
1b2d0 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72  ge clean.  Clear
1b2e0 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20 61   its dirty bit a
1b2f0 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  nd remove it fro
1b300 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  m the.** dirty p
1b310 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  age list..*/.sta
1b320 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65  tic void makeCle
1b330 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  an(PgHdr *pPg){.
1b340 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
1b350 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   ){.    pPg->dir
1b360 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ty = 0;.    if( 
1b370 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20  pPg->pDirty ){. 
1b380 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
1b390 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
1b3a0 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a  Pg->pPrevDirty;.
1b3b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
1b3c0 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b  g->pPrevDirty ){
1b3d0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
1b3e0 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d  vDirty->pDirty =
1b3f0 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
1b400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1b410 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72  Pg->pPager->pDir
1b420 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  ty = pPg->pDirty
1b430 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
1b440 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
1b450 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
1b460 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69  ble.  The page i
1b470 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1b480 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69  he journal .** i
1b490 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
1b4a0 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73  e already.  This
1b4b0 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
1b4c0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
1b4d0 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  aking.** changes
1b4e0 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   to a page..**.*
1b4f0 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
1b500 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1b510 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
1b520 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  er creates a new
1b530 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
1b540 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52  acquires a RESER
1b550 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
1b560 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68  database.  If th
1b570 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  e RESERVED.** lo
1b580 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ck could not be 
1b590 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72  acquired, this r
1b5a0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
1b5b0 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65  QLITE_BUSY.  The
1b5c0 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
1b5d0 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66  ine must check f
1b5e0 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76  or that return v
1b5f0 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65  alue and be care
1b600 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68  ful not to.** ch
1b610 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
1b620 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f  ta until this ro
1b630 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
1b640 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
1b650 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1b660 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  le could not be 
1b670 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20  written because 
1b680 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c  the disk is full
1b690 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72  ,.** then this r
1b6a0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
1b6b0 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64  QLITE_FULL and d
1b6c0 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  oes an immediate
1b6d0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c   rollback..** Al
1b6e0 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69  l subsequent wri
1b6f0 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f  te attempts also
1b700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1b710 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a  ULL until there.
1b720 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20  ** is a call to 
1b730 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1b740 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50  it() or sqlite3P
1b750 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74  agerRollback() t
1b760 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73  o.** reset..*/.s
1b770 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1b780 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
1b790 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  ){.  void *pData
1b7a0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
1b7b0 28 70 50 67 29 3b 0a 20 20 50 61 67 65 72 20 2a  (pPg);.  Pager *
1b7c0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1b7d0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
1b7e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1b7f0 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f  * Check for erro
1b800 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  rs.  */.  if( pP
1b810 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1b820 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61   .    return pPa
1b830 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1b840 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1b850 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
1b860 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
1b870 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  RM;.  }..  asser
1b880 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  t( !pPager->setM
1b890 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43  aster );..  CHEC
1b8a0 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
1b8b0 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
1b8c0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
1b8d0 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
1b8e0 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20  ontent==1, that 
1b8f0 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69  means.  ** we di
1b900 64 6e 27 74 20 72 65 61 6c 6c 79 20 72 65 61 64  dn't really read
1b910 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
1b920 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  of the page.  Th
1b930 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 20 20  is can happen.  
1b940 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29  ** (for example)
1b950 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   when the page i
1b960 73 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f  s being moved to
1b970 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
1b980 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20  But.  ** now we 
1b990 61 72 65 20 28 70 65 72 68 61 70 73 29 20 6d 6f  are (perhaps) mo
1b9a0 76 69 6e 67 20 74 68 65 20 70 61 67 65 20 6f 66  ving the page of
1b9b0 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  f of the freelis
1b9c0 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65  t for.  ** reuse
1b9d0 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
1b9e0 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67 69 6e 61  know its origina
1b9f0 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61  l content so tha
1ba00 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63  t content.  ** c
1ba10 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  an be stored in 
1ba20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1ba30 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65  rnal.  So do the
1ba40 20 72 65 61 64 20 61 74 20 74 68 69 73 0a 20 20   read at this.  
1ba50 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ** time..  */.  
1ba60 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61  if( pPg->needRea
1ba70 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  d ){.    rc = re
1ba80 61 64 44 62 50 61 67 65 28 70 50 61 67 65 72 2c  adDbPage(pPager,
1ba90 20 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29   pPg, pPg->pgno)
1baa0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1bab0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bac0 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
1bad0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1bae0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1baf0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1bb00 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
1bb10 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
1bb20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
1bb30 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
1bb40 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
1bb50 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
1bb60 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
1bb70 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74  .  */.  makeDirt
1bb80 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50  y(pPg);.  if( pP
1bb90 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
1bba0 28 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  (pageInStatement
1bbb0 28 70 50 67 29 20 7c 7c 20 70 50 61 67 65 72 2d  (pPg) || pPager-
1bbc0 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
1bbd0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
1bbe0 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
1bbf0 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49  }else{..    /* I
1bc00 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
1bc10 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
1bc20 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
1bc30 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69  to be.    ** wri
1bc40 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e  tten to the tran
1bc50 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1bc60 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e  or the ckeckpoin
1bc70 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t journal.    **
1bc80 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a   or both..    **
1bc90 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68  .    ** First ch
1bca0 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20  eck to see that 
1bcb0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1bcc0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61  journal exists a
1bcd0 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  nd.    ** create
1bce0 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e   it if it does n
1bcf0 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ot..    */.    a
1bd00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1bd10 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
1bd20 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  CK );.    rc = s
1bd30 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1bd40 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66  (pPg, 0);.    if
1bd50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bd60 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1bd70 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
1bd80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1bd90 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1bda0 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21  VED );.    if( !
1bdb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1bdc0 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75  pen && pPager->u
1bdd0 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
1bde0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
1bdf0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
1be00 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1be10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1be20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1be30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1be40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
1be50 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  | !pPager->useJo
1be60 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
1be70 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1be80 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  = 1;.  .    /* T
1be90 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1bea0 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
1beb0 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
1bec0 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
1bed0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
1bee0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
1bef0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1bf00 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
1bf10 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
1bf20 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
1bf30 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
1bf40 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
1bf50 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
1bf60 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
1bf70 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d  rnal && (pPager-
1bf80 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d  >useJournal || M
1bf90 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69  EMDB) ){.      i
1bfa0 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
1bfb0 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
1bfc0 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
1bfd0 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20     int szPg;.   
1bfe0 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
1bff0 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69  {.          PgHi
1c000 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1c010 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1c020 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1c030 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1c040 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
1c050 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1c060 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1c070 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
1c080 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
1c090 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Orig==0 );.     
1c0a0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69       pHist->pOri
1c0b0 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
1c0c0 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67  Raw( pPager->pag
1c0d0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
1c0e0 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
1c0f0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rig ){.         
1c100 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
1c110 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f  >pOrig, PGHDR_TO
1c120 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
1c130 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1c140 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c150 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c160 20 20 20 20 75 33 32 20 63 6b 73 75 6d 2c 20 73      u32 cksum, s
1c170 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  aved;.          
1c180 63 68 61 72 20 2a 70 44 61 74 61 32 2c 20 2a 70  char *pData2, *p
1c190 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  End;.          /
1c1a0 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
1c1b0 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
1c1c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
1c1d0 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
1c1e0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
1c1f0 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
1c200 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
1c210 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
1c220 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1c230 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
1c240 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
1c250 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
1c260 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1c270 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20  ager) );.       
1c280 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45     pData2 = CODE
1c290 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
1c2a0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
1c2b0 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d  .          cksum
1c2c0 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
1c2d0 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
1c2e0 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  a2);.          p
1c2f0 45 6e 64 20 3d 20 70 44 61 74 61 32 20 2b 20 70  End = pData2 + p
1c300 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1c310 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61  .          pData
1c320 32 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  2 -= 4;.        
1c330 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a    saved = *(u32*
1c340 29 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20  )pEnd;.         
1c350 20 70 75 74 33 32 62 69 74 73 28 70 45 6e 64 2c   put32bits(pEnd,
1c360 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
1c370 20 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72     szPg = pPager
1c380 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20  ->pageSize+8;.  
1c390 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
1c3a0 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70  s(pData2, pPg->p
1c3b0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
1c3c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1c3d0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
1c3e0 20 70 44 61 74 61 32 2c 20 73 7a 50 67 29 3b 0a   pData2, szPg);.
1c3f0 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
1c400 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
1c410 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
1c420 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  r, pPg->pgno,.  
1c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c440 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c450 4f 66 66 2c 20 73 7a 50 67 29 29 3b 0a 20 20 20  Off, szPg));.   
1c460 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43         PAGER_INC
1c470 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1c480 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
1c490 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1c4a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73  >journalOff += s
1c4b0 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 50  zPg;.          P
1c4c0 41 47 45 52 54 52 41 43 45 34 28 22 4a 4f 55 52  AGERTRACE4("JOUR
1c4d0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
1c4e0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
1c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c500 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1c510 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
1c520 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
1c530 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 70 45         *(u32*)pE
1c540 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 09 20 20  nd = saved;...  
1c550 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
1c560 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67 20  occured writing 
1c570 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1c580 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ile. The .      
1c590 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1c5a0 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
1c5b0 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
1c5c0 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
1c5d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1c5e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c5f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1c600 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c610 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1c620 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
1c630 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61  c++;.          a
1c640 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1c650 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
1c660 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1c670 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
1c680 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1c690 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1c6a0 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65           pPg->ne
1c6b0 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
1c6c0 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
1c6d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c6e0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1c6f0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1c700 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
1c710 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1c720 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
1c730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1c740 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c750 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
1c760 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a  ync = !pPager->j
1c770 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26  ournalStarted &&
1c780 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1c790 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
1c7a0 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64  RACE4("APPEND %d
1c7b0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
1c7c0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
1c7d0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1c7e0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1c7f0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
1c800 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nc);.      }.   
1c810 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
1c820 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
1c830 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1c840 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1c850 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1c860 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  al = 1;.    }.  
1c870 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
1c880 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1c890 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
1c8a0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
1c8b0 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
1c8c0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
1c8d0 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
1c8e0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
1c8f0 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
1c900 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
1c910 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
1c920 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
1c930 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
1c940 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
1c950 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
1c960 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
1c970 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
1c980 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1c990 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1c9a0 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 49 6e  .     && !pageIn
1c9b0 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a  Statement(pPg) .
1c9c0 20 20 20 20 20 26 26 20 28 69 6e 74 29 70 50 67       && (int)pPg
1c9d0 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
1c9e0 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b  stmtSize .    ){
1c9f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ca00 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
1ca10 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
1ca20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1ca30 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
1ca40 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1ca50 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1ca60 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1ca70 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1ca80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ca90 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20  pHist->pStmt==0 
1caa0 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
1cab0 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  ->pStmt = sqlite
1cac0 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65  MallocRaw( pPage
1cad0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
1cae0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1caf0 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
1cb00 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
1cb10 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f  t->pStmt, PGHDR_
1cb20 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
1cb30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1cb40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cb50 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1cb60 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
1cb70 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1cb80 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1cb90 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1cba0 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
1cbb0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
1cbc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cbd0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d    char *pData2 =
1cbe0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1cbf0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1cc00 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20 20 20 20  , 7)-4;.        
1cc10 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32  put32bits(pData2
1cc20 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1cc30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1cc40 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1cc50 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20  ->stfd, pData2, 
1cc60 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1cc70 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  +4);.        PAG
1cc80 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a  ERTRACE3("STMT-J
1cc90 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1cca0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1ccb0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1ccc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1ccd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1cce0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1ccf0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1cd00 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
1cd10 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  tmtNRec++;.     
1cd20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1cd30 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
1cd40 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1cd50 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
1cd60 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1cd70 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
1cd80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1cd90 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
1cda0 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
1cdb0 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
1cdc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1cdd0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
1cde0 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
1cdf0 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
1ce00 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
1ce10 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1ce20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
1ce30 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
1ce40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
1ce50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
1ce60 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
1ce70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1ce80 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
1ce90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1cea0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1ceb0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
1cec0 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67   mark a data-pag
1ced0 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49  e as writable. I
1cee0 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72  t uses .** pager
1cef0 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e  _write() to open
1cf00 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
1cf10 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1cf20 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61  ready open).** a
1cf30 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67  nd write the pag
1cf40 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20  e *pData to the 
1cf50 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
1cf60 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1cf70 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
1cf80 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
1cf90 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
1cfa0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
1cfb0 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
1cfc0 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
1cfd0 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
1cfe0 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
1cff0 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
1d000 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
1d010 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
1d020 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
1d030 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1d040 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
1d050 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
1d060 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
1d070 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d080 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
1d090 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
1d0a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
1d0b0 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
1d0c0 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
1d0d0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1d0e0 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
1d0f0 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
1d100 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
1d110 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1d120 0a 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26  ..  if( !MEMDB &
1d130 26 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  & nPagePerSector
1d140 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
1d150 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
1d160 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1d170 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1d180 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1d190 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
1d1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d1b0 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
1d1c0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
1d1d0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
1d1e0 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  .    int nPage; 
1d1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d200 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1d210 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
1d220 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
1d230 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20      int ii;..   
1d240 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
1d250 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e  tSync flag to 1.
1d260 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
1d270 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
1d280 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a   a journal.    *
1d290 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  * header to be w
1d2a0 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
1d2b0 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
1d2c0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
1d2d0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1d2e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d2f0 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a  doNotSync==0 );.
1d300 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
1d310 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20  tSync = 1;..    
1d320 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73  /* This trick as
1d330 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20  sumes that both 
1d340 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
1d350 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72  d sector-size ar
1d360 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65  e.    ** an inte
1d370 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20  ger power of 2. 
1d380 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65  It sets variable
1d390 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e   pg1 to the iden
1d3a0 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66  tifier.    ** of
1d3b0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1d3c0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
1d3d0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
1d3e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20  .    */.    pg1 
1d3f0 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  = ((pPg->pgno-1)
1d400 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63   & ~(nPagePerSec
1d410 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20  tor-1)) + 1;..  
1d420 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73    nPageCount = s
1d430 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1d440 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
1d450 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
1d460 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
1d470 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
1d480 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
1d490 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1d4a0 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
1d4b0 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
1d4c0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
1d4d0 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
1d4e0 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
1d4f0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
1d500 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
1d510 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
1d520 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
1d530 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
1d540 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
1d550 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
1d560 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
1d570 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
1d580 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1d590 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
1d5a0 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
1d5b0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1d5c0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  r->aInJournal ||
1d5d0 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
1d5e0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70 67 3e  | .          pg>
1d5f0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1d600 7a 65 20 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e  ze || !(pPager->
1d610 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d  aInJournal[pg/8]
1d620 26 28 31 3c 3c 28 70 67 26 37 29 29 29 0a 20 20  &(1<<(pg&7))).  
1d630 20 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20 20      ) {.        
1d640 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
1d650 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
1d660 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72  .          PgHdr
1d670 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20   *pPage;.       
1d680 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1d690 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
1d6a0 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
1d6b0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1d6c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d6d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1d6e0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
1d6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1d700 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1d710 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1d720 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1d730 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1d740 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d750 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a  doNotSync==1 );.
1d760 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
1d770 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  tSync = 0;.  }el
1d780 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
1d790 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
1d7a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d7b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1d7c0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1d7d0 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
1d7e0 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
1d7f0 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
1d800 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
1d810 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
1d820 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
1d830 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
1d840 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
1d850 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1d860 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
1d870 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
1d880 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
1d890 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
1d8a0 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
1d8b0 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65  pPg->dirty;.}.#e
1d8c0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
1d8d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
1d8e0 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
1d8f0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
1d900 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68  single page with
1d910 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1d920 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a   in the third.**
1d930 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
1d940 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76  t sqlite3PagerOv
1d950 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  erwrite(Pager *p
1d960 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
1d970 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  , void *pData){.
1d980 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1d990 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
1d9a0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1d9b0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
1d9c0 50 67 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  Pg);.  if( rc==S
1d9d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d9e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d9f0 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20  rWrite(pPg);.   
1da00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1da10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  OK ){.      memc
1da20 70 79 28 73 71 6c 69 74 65 33 50 61 67 65 72 47  py(sqlite3PagerG
1da30 65 74 44 61 74 61 28 70 50 67 29 2c 20 70 44 61  etData(pPg), pDa
1da40 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
1da50 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
1da60 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1da70 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  ef(pPg);.  }.  r
1da80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1da90 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
1daa0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
1dab0 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
1dac0 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1dad0 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
1dae0 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
1daf0 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
1db00 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
1db10 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
1db20 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
1db30 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
1db40 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
1db50 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
1db60 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
1db70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
1db80 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
1db90 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
1dba0 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
1dbb0 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
1dbc0 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
1dbd0 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
1dbe0 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
1dbf0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
1dc00 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
1dc10 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
1dc20 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
1dc30 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
1dc40 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1dc50 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
1dc60 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
1dc70 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
1dc80 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
1dc90 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
1dca0 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
1dcb0 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
1dcc0 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
1dcd0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1dce0 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61  alled, set the a
1dcf0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
1dd00 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53  ag to true..** S
1dd10 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
1dd20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  to sqlite3PagerD
1dd30 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
1dd40 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a  r the same page.
1dd50 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74  ** will thereaft
1dd60 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20  er be ignored.  
1dd70 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
1dd80 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f  y to avoid a pro
1dd90 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20  blem.** where a 
1dda0 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69  page with data i
1ddb0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
1ddc0 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f  reelist during o
1ddd0 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  ne part of.** a 
1dde0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e  transaction then
1ddf0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1de00 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
1de10 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a  g a later part.*
1de20 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72  * of the same tr
1de30 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65  ansaction and re
1de40 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74  used for some ot
1de50 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68  her purpose.  Wh
1de60 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73  en it.** is firs
1de70 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  t added to the f
1de80 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f  reelist, this ro
1de90 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1dea0 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a    When reused,.*
1deb0 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  * the sqlite3Pag
1dec0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1ded0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1dee0 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  ed.  But because
1def0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e   the.** page con
1df00 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64  tains critical d
1df10 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65  ata, we still ne
1df20 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74  ed to be sure it
1df30 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20   gets.** rolled 
1df40 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66  back in spite of
1df50 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
1df60 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1df70 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  call..*/.void sq
1df80 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
1df90 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
1dfa0 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
1dfb0 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
1dfc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1dfd0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
1dfe0 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75  if( MEMDB ) retu
1dff0 72 6e 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79  rn;.  pPg->alway
1e000 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
1e010 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
1e020 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  && !pPager->stmt
1e030 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73  InUse ){.    ass
1e040 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1e050 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1e060 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1e070 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
1e080 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
1e090 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1e0a0 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
1e0b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1e0c0 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
1e0d0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
1e0e0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1e0f0 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
1e100 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
1e110 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
1e120 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
1e130 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
1e140 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
1e150 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
1e160 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
1e170 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
1e180 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
1e190 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
1e1a0 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
1e1b0 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
1e1c0 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
1e1d0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
1e1e0 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
1e1f0 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
1e200 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
1e210 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
1e220 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
1e230 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
1e240 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
1e250 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
1e260 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
1e270 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
1e280 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
1e290 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
1e2a0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1e2b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
1e2c0 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f  GERTRACE3("DONT_
1e2d0 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
1e2e0 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
1e2f0 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
1e300 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  r));.      IOTRA
1e310 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64  CE(("CLEAN %p %d
1e320 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1e330 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d  ->pgno)).      m
1e340 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23  akeClean(pPg);.#
1e350 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1e360 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70  CK_PAGES.      p
1e370 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
1e380 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1e390 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  g);.#endif.    }
1e3a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
1e3b0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
1e3c0 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
1e3d0 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72  ager that if a r
1e3e0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a  ollback occurs,.
1e3f0 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ** it is not nec
1e400 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72  essary to restor
1e410 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68  e the data on th
1e420 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54  e given page.  T
1e430 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  his.** means tha
1e440 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  t the pager does
1e450 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63   not have to rec
1e460 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61  ord the given pa
1e470 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c  ge in the.** rol
1e480 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
1e490 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20  *.** If we have 
1e4a0 6e 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79  not yet actually
1e4b0 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
1e4c0 74 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 28  t of this page (
1e4d0 69 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e  if.** the PgHdr.
1e4e0 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 69 73  needRead flag is
1e4f0 20 73 65 74 29 20 74 68 65 6e 20 74 68 69 73 20   set) then this 
1e500 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20  routine acts as 
1e510 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61  a promise.** tha
1e520 74 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  t we will never 
1e530 6e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 65  need to read the
1e540 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e   page content in
1e550 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20   the future..** 
1e560 73 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64 20  so the needRead 
1e570 66 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61  flag can be clea
1e580 72 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  red at this poin
1e590 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1e5a0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1e5b0 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29  ack(DbPage *pPg)
1e5c0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1e5d0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1e5e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1e5f0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1e600 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69  _RESERVED );.  i
1e610 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1e620 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75  alOpen==0 ) retu
1e630 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61  rn;.  if( pPg->a
1e640 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
1e650 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
1e660 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42  ollback || MEMDB
1e670 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1e680 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
1e690 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1e6a0 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
1e6b0 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
1e6c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e6d0 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
1e6e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
1e6f0 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
1e700 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1e710 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50  >pgno&7);.    pP
1e720 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1e730 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52  ;.    pPg->needR
1e740 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ead = 0;.    if(
1e750 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1e760 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  se ){.      pPag
1e770 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
1e780 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
1e790 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
1e7a0 20 20 7d 0a 20 20 20 20 50 41 47 45 52 54 52 41    }.    PAGERTRA
1e7b0 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41  CE3("DONT_ROLLBA
1e7c0 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  CK page %d of %d
1e7d0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
1e7e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1e7f0 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ;.    IOTRACE(("
1e800 47 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22  GARBAGE %p %d\n"
1e810 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1e820 67 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28 20  gno)).  }.  if( 
1e830 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1e840 65 20 0a 20 20 20 26 26 20 21 70 61 67 65 49 6e  e .   && !pageIn
1e850 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a  Statement(pPg) .
1e860 20 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e     && (int)pPg->
1e870 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
1e880 6d 74 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20  mtSize .  ){.   
1e890 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1e8a0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
1e8b0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1e8c0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
1e8d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e8e0 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
1e8f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1e900 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1e910 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1e920 67 6e 6f 26 37 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  gno&7);.  }.}...
1e930 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1e940 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
1e950 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61  increment the da
1e960 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
1e970 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73  ge-counter,.** s
1e980 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34  tored at byte 24
1e990 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
1e9a0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1e9b0 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
1e9c0 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
1e9d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
1e9e0 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33  dr *pPgHdr;.  u3
1e9f0 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1ea00 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1ea10 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e  f( !pPager->chan
1ea20 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20  geCountDone ){. 
1ea30 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1ea40 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
1ea50 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
1ea60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ea70 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
1ea80 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
1ea90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1eaa0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1eab0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1eac0 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
1ead0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1eae0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1eaf0 6e 20 72 63 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  n rc;.  .    /* 
1eb00 52 65 61 64 20 74 68 65 20 63 75 72 72 65 6e 74  Read the current
1eb10 20 76 61 6c 75 65 20 61 74 20 62 79 74 65 20 32   value at byte 2
1eb20 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65  4. */.    change
1eb30 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69  _counter = retri
1eb40 65 76 65 33 32 62 69 74 73 28 70 50 67 48 64 72  eve32bits(pPgHdr
1eb50 2c 20 32 34 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  , 24);.  .    /*
1eb60 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
1eb70 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
1eb80 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
1eb90 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
1eba0 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
1ebb0 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62  er++;.    put32b
1ebc0 69 74 73 28 28 28 63 68 61 72 2a 29 50 47 48 44  its(((char*)PGHD
1ebd0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72  R_TO_DATA(pPgHdr
1ebe0 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  ))+24, change_co
1ebf0 75 6e 74 65 72 29 3b 0a 20 20 0a 20 20 20 20 2f  unter);.  .    /
1ec00 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
1ec10 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
1ec20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1ec30 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
1ec40 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
1ec50 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
1ec60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1ec70 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1ec80 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
1ec90 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1eca0 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
1ecb0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
1ecc0 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
1ecd0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1ece0 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
1ecf0 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
1ed00 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
1ed10 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1ed20 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
1ed30 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
1ed40 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
1ed50 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
1ed60 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
1ed70 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1ed80 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
1ed90 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
1eda0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1edb0 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20   is synced, all 
1edc0 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74  dirty pages writ
1edd0 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ten.** to the da
1ede0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1edf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ee00 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e  e synced. The on
1ee10 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a  ly thing that.**
1ee20 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
1ee30 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1ee40 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  on is to delete 
1ee50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1ee60 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a   (or.** master j
1ee70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
1ee80 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
1ee90 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
1eea0 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
1eeb0 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
1eec0 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
1eed0 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
1eee0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
1eef0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
1ef00 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
1ef10 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75  f parameter nTru
1ef20 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nc is non-zero, 
1ef30 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  then the pager f
1ef40 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
1ef50 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61   to.** nTrunc pa
1ef60 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65  ges (this is use
1ef70 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
1ef80 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a   databases)..*/.
1ef90 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1efa0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 50  CommitPhaseOne(P
1efb0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
1efc0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
1efd0 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b  r, Pgno nTrunc){
1efe0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1eff0 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52 54  TE_OK;..  PAGERT
1f000 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20  RACE4("DATABASE 
1f010 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
1f020 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d  aster=%s nTrunc=
1f030 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
1f040 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
1f050 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63   zMaster, nTrunc
1f060 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1f070 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
1f080 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
1f090 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1f0a0 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
1f0b0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
1f0c0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
1f0d0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
1f0e0 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
1f0f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1f100 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21  AGER_SYNCED && !
1f110 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
1f120 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20  >dirtyCache ){. 
1f130 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
1f140 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1f150 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1f160 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d  ;..    /* If a m
1f170 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1f180 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65  le name has alre
1f190 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1f1a0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a   to the.    ** j
1f1b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
1f1c0 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71  n no sync is req
1f1d0 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70 70  uired. This happ
1f1e0 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20  ens when it is. 
1f1f0 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74     ** written, t
1f200 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
1f210 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65  fails to upgrade
1f220 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
1f230 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   to an.    ** EX
1f240 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
1f250 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
1f260 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f  process tries to
1f270 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20   commit the.    
1f280 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ** transaction t
1f290 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c  he m-j name will
1f2a0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1f2b0 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  en written..    
1f2c0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
1f2d0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b  er->setMaster ){
1f2e0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1f2f0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1f300 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
1f310 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f320 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1f330 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20  c_exit;.#ifndef 
1f340 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1f350 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
1f360 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
1f370 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1f380 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1f390 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61   made the databa
1f3a0 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e  se smaller, then
1f3b0 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20   all pages.     
1f3c0 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63     ** being disc
1f3d0 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75  arded by the tru
1f3e0 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ncation must be 
1f3f0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1f400 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
1f410 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  * file..        
1f420 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
1f430 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  i;.        int i
1f440 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f  Skip = PAGER_MJ_
1f450 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20  PGNO(pPager);.  
1f460 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72        for( i=nTr
1f470 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72  unc+1; i<=pPager
1f480 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b  ->origDbSize; i+
1f490 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  + ){.          i
1f4a0 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e  f( !(pPager->aIn
1f4b0 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28  Journal[i/8] & (
1f4c0 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69 21  1<<(i&7))) && i!
1f4d0 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
1f4e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f4f0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
1f500 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, i, &pPg);.   
1f510 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1f520 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1f530 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1f540 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1f550 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f560 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
1f570 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1f580 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
1f590 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f5a0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1f5b0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1f5c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
1f5d0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1f5e0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1f5f0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1f600 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1f610 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f620 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1f630 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1f640 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
1f650 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1f660 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f670 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1f680 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  it;.    }..#ifnd
1f690 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f6a0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1f6b0 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
1f6c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f6d0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
1f6e0 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
1f6f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f700 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1f710 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
1f720 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
1f730 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70  rite all dirty p
1f740 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
1f750 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
1f760 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
1f770 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1f780 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
1f790 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
1f7a0 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
1f7b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f7c0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1f7d0 65 78 69 74 3b 0a 20 20 20 20 70 50 61 67 65 72  exit;.    pPager
1f7e0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20  ->pDirty = 0;.. 
1f7f0 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
1f800 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
1f810 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1f820 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
1f830 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1f840 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
1f850 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49   0);.    }.    I
1f860 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20  OTRACE(("DBSYNC 
1f870 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
1f880 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
1f890 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45  te = PAGER_SYNCE
1f8a0 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d  D;.  }else if( M
1f8b0 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d  EMDB && nTrunc!=
1f8c0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
1f8d0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1f8e0 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
1f8f0 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  c);.  }..sync_ex
1f900 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  it:.  return rc;
1f910 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  .}.../*.** Commi
1f920 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f  t all changes to
1f930 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
1f940 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  d release the wr
1f950 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ite lock..**.** 
1f960 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61  If the commit fa
1f970 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
1f980 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61  on, a rollback a
1f990 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a  ttempt is made.*
1f9a0 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
1f9b0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1f9c0 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
1f9d0 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f  worked, SQLITE_O
1f9e0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
1f9f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1fa00 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
1fa10 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65  Two(Pager *pPage
1fa20 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
1fa30 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
1fa40 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1fa50 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
1fa60 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1fa70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1fa80 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
1fa90 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
1faa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1fab0 52 4f 52 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52  ROR;.  }.  PAGER
1fac0 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25  TRACE2("COMMIT %
1fad0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1fae0 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
1faf0 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  MDB ){.    pPg =
1fb00 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
1fb10 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
1fb20 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  r);.    while( p
1fb30 50 67 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69  Pg ){.      PgHi
1fb40 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1fb50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1fb60 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1fb70 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
1fb80 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  ist);.      pPg-
1fb90 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
1fba0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
1fbb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
1fbc0 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
1fbd0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
1fbe0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48  nc = 0;.      pH
1fbf0 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  ist->pPrevStmt =
1fc00 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
1fc10 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
1fc20 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
1fc30 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
1fc40 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69  ->pDirty = 0;.#i
1fc50 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1fc60 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
1fc70 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
1fc80 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
1fc90 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1fca0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1fcb0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1fcc0 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
1fcd0 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52  t( !pPg->alwaysR
1fce0 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
1fcf0 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
1fd00 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
1fd10 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
1fd20 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23  pStmt );.    }.#
1fd30 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72  endif.    pPager
1fd40 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
1fd50 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1fd60 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
1fd70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fd80 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
1fd90 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1fda0 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65  alOpen || !pPage
1fdb0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b  r->dirtyCache );
1fdc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1fdd0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1fde0 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61 67 65  SYNCED || !pPage
1fdf0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b  r->dirtyCache );
1fe00 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e  .  rc = pager_en
1fe10 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
1fe20 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1fe30 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1fe40 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  er, rc);.}../*.*
1fe50 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  * Rollback all c
1fe60 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74  hanges.  The dat
1fe70 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
1fe80 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1fe90 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e   mode..** All in
1fea0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
1feb0 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68  ges revert to th
1fec0 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
1fed0 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54  a contents..** T
1fee0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
1fef0 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  leted..**.** Thi
1ff00 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
1ff10 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d   fail unless som
1ff20 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
1ff30 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
1ff40 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
1ff50 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
1ff60 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20   or unless some 
1ff70 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
1ff80 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73   is writing tras
1ff90 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  h into the journ
1ffa0 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f  al file (SQLITE_
1ffb0 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75  CORRUPT) or.** u
1ffc0 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61  nless a prior ma
1ffd0 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53  lloc() failed (S
1ffe0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41  QLITE_NOMEM).  A
1fff0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
20000 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65  .** codes are re
20010 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74  turned for all t
20020 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20  hese occasions. 
20030 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53   Otherwise,.** S
20040 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
20050 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
20060 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
20070 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
20080 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41  {.  int rc;.  PA
20090 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42  GERTRACE2("ROLLB
200a0 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
200b0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
200c0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
200d0 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
200e0 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
200f0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
20100 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
20110 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20  tory *pHist;.   
20120 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61     assert( !p->a
20130 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
20140 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64  .      if( !p->d
20150 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  irty ){.        
20160 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
20170 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
20180 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
20190 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
201a0 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
201b0 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
201c0 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
201d0 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  r))->pStmt );.  
201e0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
201f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
20200 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
20210 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b  HIST(p, pPager);
20220 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74  .      if( pHist
20230 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
20240 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
20250 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73  TO_DATA(p), pHis
20260 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72  t->pOrig, pPager
20270 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
20280 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
20290 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20  ("ROLLBACK-PAGE 
202a0 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e  %d of %d\n", p->
202b0 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
202c0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65  ager));.      }e
202d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50 41 47  lse{.        PAG
202e0 45 52 54 52 41 43 45 33 28 22 50 41 47 45 20 25  ERTRACE3("PAGE %
202f0 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64  d is clean on %d
20300 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41  \n", p->pgno, PA
20310 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
20320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
20330 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74  earHistory(pHist
20340 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74  );.      p->dirt
20350 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  y = 0;.      p->
20360 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
20370 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74       pHist->inSt
20380 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48  mt = 0;.      pH
20390 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  ist->pPrevStmt =
203a0 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
203b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
203c0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
203d0 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
203e0 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
203f0 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  p, pPager->pageS
20400 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
20410 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
20420 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
20430 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
20440 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
20450 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
20460 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20  origDbSize;.    
20470 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
20480 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
20490 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
204a0 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
204b0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
204c0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
204d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
204e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
204f0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
20500 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
20510 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
20520 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
20530 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
20540 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
20550 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
20560 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
20570 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
20580 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
20590 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
205a0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
205b0 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
205c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
205d0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
205e0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
205f0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
20600 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
20610 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
20620 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  RVED ){.    int 
20630 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rc2;.    rc = pa
20640 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
20650 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32  ger, 0);.    rc2
20660 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
20670 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
20680 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
20690 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
206a0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
206b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
206c0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
206d0 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
206e0 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73  }.  /* pager_res
206f0 65 74 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  et(pPager); */. 
20700 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
20710 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  = -1;..  /* If a
20720 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
20730 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  uring a ROLLBACK
20740 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  , we can no long
20750 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67  er trust the pag
20760 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53  er.  ** cache. S
20770 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72  o call pager_err
20780 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20  or() on the way 
20790 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  out to make any 
207a0 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73  error .  ** pers
207b0 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72  istent..  */.  r
207c0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
207d0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
207e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
207f0 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62  RUE if the datab
20800 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
20810 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52  ed read-only.  R
20820 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
20830 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
20840 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72  s (in theory) wr
20850 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  itable..*/.int s
20860 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
20870 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
20880 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
20890 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
208a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
208b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
208c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
208d0 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pager..*/.int s
208e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
208f0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
20900 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
20910 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69  ger->nRef;.}..#i
20920 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
20930 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
20940 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
20950 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
20960 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
20970 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53  t *sqlite3PagerS
20980 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
20990 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
209a0 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20  t a[11];.  a[0] 
209b0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a  = pPager->nRef;.
209c0 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d    a[1] = pPager-
209d0 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d  >nPage;.  a[2] =
209e0 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b   pPager->mxPage;
209f0 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
20a00 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d  ->dbSize;.  a[4]
20a10 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
20a20 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
20a30 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b  r->errCode;.  a[
20a40 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
20a50 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
20a60 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
20a70 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20  ] = 0;  /* Used 
20a80 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f  to be pPager->nO
20a90 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20  vfl */.  a[9] = 
20aa0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
20ab0 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
20ac0 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72  >nWrite;.  retur
20ad0 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n a;.}.#endif../
20ae0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
20af0 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
20b00 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
20b10 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
20b20 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
20b30 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
20b40 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
20b50 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
20b60 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
20b70 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
20b80 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
20b90 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
20ba0 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
20bb0 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
20bc0 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
20bd0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
20be0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
20bf0 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  tBegin(Pager *pP
20c00 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
20c10 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
20c20 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b  er->stmtInUse );
20c30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20c40 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
20c50 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65  SHARED );.  asse
20c60 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
20c70 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52  ze>=0 );.  PAGER
20c80 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47  TRACE2("STMT-BEG
20c90 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IN %d\n", PAGERI
20ca0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
20cb0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
20cc0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
20cd0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
20ce0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
20cf0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
20d00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20d10 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  K;.  }.  if( !pP
20d20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
20d30 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  n ){.    pPager-
20d40 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
20d50 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
20d60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
20d70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
20d80 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
20d90 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
20da0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
20db0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
20dc0 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
20dd0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30  ager->aInStmt==0
20de0 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   ){.    /* sqlit
20df0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
20e00 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
20e10 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ); */.    return
20e20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
20e30 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
20e40 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  G.  rc = sqlite3
20e50 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
20e60 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
20e70 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
20e80 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
20e90 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
20ea0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20eb0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70  ->stmtJSize == p
20ec0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20ed0 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50  f );.#endif.  pP
20ee0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
20ef0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
20f00 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e  lOff;.  pPager->
20f10 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
20f20 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61  r->dbSize;.  pPa
20f30 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
20f40 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
20f50 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65  tmtCksum = pPage
20f60 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
20f70 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  if( !pPager->stm
20f80 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  tOpen ){.    rc 
20f90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
20fa0 65 6e 74 65 6d 70 28 26 70 50 61 67 65 72 2d 3e  entemp(&pPager->
20fb0 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  stfd);.    if( r
20fc0 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
20fd0 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  gin_failed;.    
20fe0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
20ff0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
21000 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
21010 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
21020 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  mtInUse = 1;.  r
21030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21040 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  . .stmt_begin_fa
21050 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
21060 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20  er->aInStmt ){. 
21070 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
21080 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a  ager->aInStmt);.
21090 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
210a0 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  tmt = 0;.  }.  r
210b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
210c0 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74  ** Commit a stat
210d0 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
210e0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
210f0 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
21100 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
21110 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
21120 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20      PgHdr *pPg, 
21130 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50 41 47 45  *pNext;.    PAGE
21140 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f  RTRACE2("STMT-CO
21150 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
21160 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
21170 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
21180 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
21190 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64  eek(pPager->stfd
211a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73  , 0);.      /* s
211b0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
211c0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
211d0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ); */.      sqli
211e0 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
211f0 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  aInStmt );.     
21200 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
21210 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
21220 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
21230 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
21240 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
21250 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
21260 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
21270 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
21280 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ger);.        pN
21290 65 78 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  ext = pHist->pNe
212a0 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  xtStmt;.        
212b0 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69  assert( pHist->i
212c0 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20  nStmt );.       
212d0 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d   pHist->inStmt =
212e0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   0;.        pHis
212f0 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
21300 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
21310 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
21320 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
21330 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Stmt);.        p
21340 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
21350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21360 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
21370 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Rec = 0;.    pPa
21380 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
21390 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
213a0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  pStmt = 0;.  }. 
213b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
213c0 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
213d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
213e0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
213f0 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
21400 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
21410 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61  rStmtRollback(Pa
21420 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
21430 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50  int rc;.  if( pP
21440 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
21450 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
21460 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43  E2("STMT-ROLLBAC
21470 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
21480 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
21490 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
214a0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
214b0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
214c0 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  Hist;.      for(
214d0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
214e0 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48 69 73  t; pPg; pPg=pHis
214f0 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20  t->pNextStmt){. 
21500 20 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50         pHist = P
21510 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
21520 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
21530 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
21540 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
21550 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
21560 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73  _DATA(pPg), pHis
21570 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72  t->pStmt, pPager
21580 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
21590 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
215a0 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
215b0 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74  .          pHist
215c0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
215d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
215e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
215f0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  ize = pPager->st
21600 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61  mtSize;.      pa
21610 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
21620 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
21630 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
21640 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21650 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74     rc = pager_st
21660 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  mt_playback(pPag
21670 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
21680 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
21690 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
216a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
216b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
216c0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
216d0 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
216e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
216f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
21700 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
21710 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21720 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
21730 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
21740 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
21750 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
21760 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
21770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21780 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f   the directory o
21790 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
217a0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
217b0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
217c0 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  Dirname(Pager *p
217d0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
217e0 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
217f0 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ory;.}../*.** Re
21800 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
21810 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
21820 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63  urnal file..*/.c
21830 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
21840 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61  e3PagerJournalna
21850 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
21860 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
21870 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a  er->zJournal;.}.
21880 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
21890 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61  ue if fsync() ca
218a0 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  lls are disabled
218b0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
218c0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
218d0 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72  * if fsync()s ar
218e0 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61  e executed norma
218f0 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
21900 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50  te3PagerNosync(P
21910 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21920 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21930 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65  noSync;.}..#ifde
21940 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
21950 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  EC./*.** Set the
21960 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
21970 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71  pager.*/.void sq
21980 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64  lite3PagerSetCod
21990 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ec(.  Pager *pPa
219a0 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ger,.  void *(*x
219b0 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
219c0 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
219d0 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a  void *pCodecArg.
219e0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  ){.  pPager->xCo
219f0 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20  dec = xCodec;.  
21a00 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
21a10 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d  g = pCodecArg;.}
21a20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
21a30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
21a40 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f  OVACUUM./*.** Mo
21a50 76 65 20 74 68 65 20 70 61 67 65 20 69 64 65 6e  ve the page iden
21a60 74 69 66 69 65 64 20 62 79 20 70 44 61 74 61 20  tified by pData 
21a70 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f  to location pgno
21a80 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a   in the file. .*
21a90 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
21aa0 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73  be no references
21ab0 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
21ac0 70 61 67 65 20 70 67 6e 6f 2e 20 49 66 20 63 75  page pgno. If cu
21ad0 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67  rrent page.** pg
21ae0 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
21af0 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
21b00 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73  k journal, it is
21b10 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 68 65   not written the
21b20 72 65 20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73  re by.** by this
21b30 20 72 6f 75 74 69 6e 65 2e 20 54 68 65 20 73 61   routine. The sa
21b40 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68  me applies to th
21b50 65 20 70 61 67 65 20 70 44 61 74 61 20 72 65 66  e page pData ref
21b60 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20  ers to on entry 
21b70 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  to.** this routi
21b80 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ne..**.** Refere
21b90 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
21ba0 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 70   refered to by p
21bb0 44 61 74 61 20 72 65 6d 61 69 6e 20 76 61 6c 69  Data remain vali
21bc0 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a  d. Updating any.
21bd0 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73  ** meta-data ass
21be0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
21bf0 65 20 70 44 61 74 61 20 28 69 2e 65 2e 20 64 61  e pData (i.e. da
21c00 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
21c10 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
21c20 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
21c30 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20   with the page) 
21c40 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
21c50 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
21c60 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61  ler..**.** A tra
21c70 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
21c80 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69   active when thi
21c90 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
21ca0 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20  led. It used to 
21cb0 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74  be.** required t
21cc0 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hat a statement 
21cd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
21ce0 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20  not active, but 
21cf0 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
21d00 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d  .** has been rem
21d10 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44  oved (CREATE IND
21d20 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65  EX needs to move
21d30 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73   a page when a s
21d40 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
21d50 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
21d60 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e)..*/.int sqlit
21d70 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
21d80 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44  Pager *pPager, D
21d90 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f  bPage *pPg, Pgno
21da0 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
21db0 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20  *pPgOld; .  int 
21dc0 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79  h;.  Pgno needSy
21dd0 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  ncPgno = 0;..  a
21de0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
21df0 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  >0 );..  PAGERTR
21e00 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61  ACE5("MOVE %d pa
21e10 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d  ge %d (needSync=
21e20 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c  %d) moves to %d\
21e30 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52  n", .      PAGER
21e40 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
21e50 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
21e60 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49  Sync, pgno);.  I
21e70 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70  OTRACE(("MOVE %p
21e80 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %d %d\n", pPage
21e90 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67  r, pPg->pgno, pg
21ea0 6e 6f 29 29 0a 0a 20 20 69 66 28 20 70 50 67 2d  no))..  if( pPg-
21eb0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
21ec0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
21ed0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61  pPg->pgno;.    a
21ee0 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
21ef0 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
21f00 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20  ert( pPg->dirty 
21f10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21f20 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
21f30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  );.  }..  /* Unl
21f40 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27  ink pPg from it'
21f50 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a  s hash-chain */.
21f60 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
21f70 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  n(pPager, pPg);.
21f80 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63  .  /* If the cac
21f90 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61  he contains a pa
21fa0 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  ge with page-num
21fb0 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65  ber pgno, remove
21fc0 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74   it.  ** from it
21fd0 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  's hash chain. A
21fe0 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
21ff0 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
22000 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
22010 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
22020 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
22030 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
22040 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
22050 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
22060 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
22070 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65  .  pPgOld = page
22080 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
22090 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
220a0 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65  gOld ){.    asse
220b0 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66  rt( pPgOld->nRef
220c0 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e  ==0 );.    unlin
220d0 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
220e0 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  r, pPgOld);.    
220f0 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64  makeClean(pPgOld
22100 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 4f 6c  );.    if( pPgOl
22110 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  d->needSync ){. 
22120 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
22130 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29  Old->inJournal )
22140 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
22150 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
22160 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
22170 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 1;.      asser
22180 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
22190 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ync );.    }.  }
221a0 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68  ..  /* Change th
221b0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
221c0 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74  r pPg and insert
221d0 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77   it into the new
221e0 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a   hash-chain. */.
221f0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
22200 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f  0 );.  pPg->pgno
22210 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70   = pgno;.  h = p
22220 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
22230 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20 70  Hash-1);.  if( p
22240 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
22250 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
22260 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d  Pager->aHash[h]-
22270 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
22280 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
22290 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
222a0 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50   = pPg;.  }.  pP
222b0 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
222c0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
222d0 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  .  pPager->aHash
222e0 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67  [h] = pPg;.  pPg
222f0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
22300 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50  ..  makeDirty(pP
22310 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69  g);.  pPager->di
22320 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20  rtyCache = 1;.. 
22330 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e   if( needSyncPgn
22340 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  o ){.    /* If n
22350 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e  eedSyncPgno is n
22360 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
22370 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
22380 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20  eeds to be .    
22390 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  ** sync()ed befo
223a0 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77  re any data is w
223b0 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61  ritten to databa
223c0 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65  se file page nee
223d0 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a  dSyncPgno..    *
223e0 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20  * Currently, no 
223f0 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
22400 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
22410 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  he and the .    
22420 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72  ** Pager.aInJour
22430 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e  nal bit has been
22440 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73   set. This needs
22450 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20   to be remedied 
22460 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a  by loading.    *
22470 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  * the page into 
22480 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
22490 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20  and setting the 
224a0 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66  PgHdr.needSync f
224b0 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
224c0 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61  ** The sqlite3Pa
224d0 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61  gerGet() call ma
224e0 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
224f0 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
22500 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
22510 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
22520 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
22530 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
22540 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64  int rc;.    PgHd
22550 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61  r *pPgHdr;.    a
22560 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
22570 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72  eedSync );.    r
22580 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
22590 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64  Get(pPager, need
225a0 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64  SyncPgno, &pPgHd
225b0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
225c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
225d0 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
225e0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
225f0 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65 65  .    pPgHdr->nee
22600 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  dSync = 1;.    p
22610 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  PgHdr->inJournal
22620 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69   = 1;.    makeDi
22630 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20  rty(pPgHdr);.   
22640 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
22650 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a  ef(pPgHdr);.  }.
22660 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22670 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
22680 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
22690 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74  inter to the dat
226a0 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  a for the specif
226b0 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
226c0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
226d0 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70  etData(DbPage *p
226e0 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50 47  Pg){.  return PG
226f0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
22700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22710 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
22720 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  he Pager.nExtra 
22730 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22  bytes of "extra"
22740 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63   space .** alloc
22750 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
22760 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
22770 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
22780 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
22790 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
227a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
227b0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
227c0 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f   return (pPager?
227d0 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
227e0 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b 0a  Pg, pPager):0);.
227f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
22800 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
22810 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
22820 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
22830 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a  e must be one.**
22840 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   of PAGER_LOCKIN
22850 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47  GMODE_QUERY, PAG
22860 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
22870 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47  ORMAL or .** PAG
22880 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
22890 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65  XCLUSIVE. If the
228a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
228b0 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a  t _QUERY, then.*
228c0 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  * the locking-mo
228d0 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
228e0 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
228f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
22900 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69  rned value is ei
22910 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ther PAGER_LOCKI
22920 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
22930 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
22940 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c  GMODE_EXCLUSIVE,
22950 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
22960 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
22970 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f  y updated).** lo
22980 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  cking-mode..*/.i
22990 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
229a0 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72  ockingMode(Pager
229b0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
229c0 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
229d0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
229e0 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20  KINGMODE_QUERY. 
229f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
22a00 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
22a10 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20  NGMODE_NORMAL.  
22a20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
22a30 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
22a40 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
22a50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
22a60 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
22a70 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65  UERY<0 );.  asse
22a80 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
22a90 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20  GMODE_NORMAL>=0 
22aa0 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  && PAGER_LOCKING
22ab0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d  MODE_EXCLUSIVE>=
22ac0 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  0 );.  if( eMode
22ad0 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e  >=0 && !pPager->
22ae0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
22af0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
22b00 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20  eMode = eMode;. 
22b10 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
22b20 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  )pPager->exclusi
22b30 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 20 64  veMode;.}..#if d
22b40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
22b50 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
22b60 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
22b70 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
22b80 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74  rrent state of t
22b90 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72  he file lock for
22ba0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
22bb0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
22bc0 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20  value is one of 
22bd0 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f  NO_LOCK, SHARED_
22be0 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c  LOCK, RESERVED_L
22bf0 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f  OCK,.** PENDING_
22c00 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49  LOCK, or EXCLUSI
22c10 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20  VE_LOCK..*/.int 
22c20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
22c30 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  state(Pager *pPa
22c40 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ger){.  return s
22c50 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74  qlite3OsLockStat
22c60 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d  e(pPager->fd);.}
22c70 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
22c80 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
22c90 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69  ** Print a listi
22ca0 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65  ng of all refere
22cb0 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74  nced pages and t
22cc0 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a  heir ref count..
22cd0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
22ce0 61 67 65 72 52 65 66 64 75 6d 70 28 50 61 67 65  agerRefdump(Page
22cf0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
22d00 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
22d10 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
22d20 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
22d30 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
22d40 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
22d50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22d60 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
22d70 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
22d80 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  r=%p nRef=%d\n",
22d90 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67   .       pPg->pg
22da0 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  no, PGHDR_TO_DAT
22db0 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65  A(pPg), pPg->nRe
22dc0 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
22dd0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
22de0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
22df0 2f 0a                                            /.