/ Hex Artifact Content
Login

Artifact 18cc5b274a0df28dc9145da522a6e281f80b925f:


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 32 32  : pager.c,v 1.22
0350: 31 20 32 30 30 35 2f 31 31 2f 32 39 20 30 33 3a  1 2005/11/29 03:
0360: 31 33 3a 32 32 20 64 72 68 20 45 78 70 20 24 0a  13:22 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 54 52 41 43 45 31 28  .#define TRACE1(
0440: 58 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  X)       sqlite3
0450: 44 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23  DebugPrintf(X).#
0460: 64 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c  define TRACE2(X,
0470: 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  Y)     sqlite3De
0480: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a 23  bugPrintf(X,Y).#
0490: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
04a0: 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65  Y,Z)   sqlite3De
04b0: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29  bugPrintf(X,Y,Z)
04c0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 34 28  .#define TRACE4(
04d0: 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33  X,Y,Z,W) sqlite3
04e0: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
04f0: 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54 52 41  Z,W).#define TRA
0500: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) 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 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0530: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
0540: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
0550: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0560: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0570: 64 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c  define TRACE4(X,
0580: 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54  Y,Z,W).#define T
0590: 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29  RACE5(X,Y,Z,W,V)
05a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
05b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
05c0: 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65 64   macros are used
05d0: 20 77 69 74 68 69 6e 20 74 68 65 20 54 52 41 43   within the TRAC
05e0: 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76  EX() macros abov
05f0: 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75  e.** to print ou
0600: 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  t file-descripto
0610: 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52  rs. .**.** PAGER
0620: 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69  ID() takes a poi
0630: 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
0640: 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20 61  struct as it's a
0650: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0660: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0670: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0680: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
0690: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
06a0: 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  OsFile.** struct
06b0: 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e   as it's argumen
06c0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  t..*/.#define PA
06d0: 47 45 52 49 44 28 70 29 20 46 49 4c 45 48 41 4e  GERID(p) FILEHAN
06e0: 44 4c 45 49 44 28 26 28 70 29 2d 3e 66 64 29 0a  DLEID(&(p)->fd).
06f0: 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e 44  #define FILEHAND
0700: 4c 45 49 44 28 66 64 29 20 28 73 71 6c 69 74 65  LEID(fd) (sqlite
0710: 33 49 6f 2e 78 46 69 6c 65 48 61 6e 64 6c 65 28  3Io.xFileHandle(
0720: 26 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  &fd))../*.** The
0730: 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61   page cache as a
0740: 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73   whole is always
0750: 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   in one of the f
0760: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74  ollowing.** stat
0770: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  es:.**.**   PAGE
0780: 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20  R_UNLOCK        
0790: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  The page cache i
07a0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
07b0: 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20  reading or .**  
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07d0: 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65       writing the
07e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
07f0: 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20   There is no.** 
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20        data held 
0820: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
0830: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a   is the initial.
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0850: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a           state..
0860: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48  **.**   PAGER_SH
0870: 41 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20  ARED        The 
0880: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65  page cache is re
0890: 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
08a0: 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  se..**          
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69               Wri
08c0: 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d  ting is not perm
08d0: 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61  itted.  There ca
08e0: 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  n be.**         
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75                mu
0900: 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61  ltiple readers a
0910: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
0920: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20      file at the 
0950: 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  same time..**.**
0960: 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45     PAGER_RESERVE
0970: 44 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63  D      This proc
0980: 65 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64  ess has reserved
0990: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f   the database fo
09a0: 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20  r writing.**    
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79     but has not y
09d0: 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e  et made any chan
09e0: 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70  ges.  Only one p
09f0: 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20  rocess.**       
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65  at a time can re
0a20: 73 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61  serve the databa
0a30: 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61  se.  The origina
0a40: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
0a50: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0a60: 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  ase file has not
0a70: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73   been modified s
0a80: 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20  o other.**      
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73   processes may s
0ab0: 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
0ac0: 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20  the on-disk.**  
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0af0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  le..**.**   PAGE
0b00: 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20  R_EXCLUSIVE     
0b10: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  The page cache i
0b20: 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  s writing the da
0b30: 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20  tabase..**      
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75   Access is exclu
0b60: 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20  sive.  No other 
0b70: 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20  processes or.** 
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61        threads ca
0ba0: 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20  n be reading or 
0bb0: 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e  writing while on
0bc0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0bd0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
0be0: 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a  ss is writing..*
0bf0: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e  *.**   PAGER_SYN
0c00: 43 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  CED        The p
0c10: 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68  ager moves to th
0c20: 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41  is state from PA
0c30: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a  GER_EXCLUSIVE.**
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c         after all
0c60: 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76   dirty pages hav
0c70: 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
0c80: 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0ca0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
0cb0: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65   the file has be
0cc0: 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20  en synced to.** 
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20        disk. All 
0cf0: 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20  that remains to 
0d00: 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20  do is to remove 
0d10: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75               jou
0d30: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68  rnal file and th
0d40: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  e transaction wi
0d50: 6c 6c 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  ll be.**        
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
0d70: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
0d80: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 63  The page cache c
0d90: 6f 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45 52  omes up in PAGER
0da0: 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69  _UNLOCK.  The fi
0db0: 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71  rst time a.** sq
0dc0: 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
0dd0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74 61   occurs, the sta
0de0: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0df0: 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a  o PAGER_SHARED..
0e00: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
0e10: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
0e20: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0e30: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0e40: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0e50: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0e60: 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  o PAGER_UNLOCK. 
0e70: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a   The first time.
0e80: 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33 70  ** that sqlite3p
0e90: 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
0ea0: 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74  called, the stat
0eb0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  e transitions to
0ec0: 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56  .** PAGER_RESERV
0ed0: 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20  ED.  (Note that 
0ee0: 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74  sqlite_page_writ
0ef0: 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a  e() can only be.
0f00: 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  ** called on an 
0f10: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
0f20: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
0f30: 74 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74  t the pager must
0f40: 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f  .** be in PAGER_
0f50: 53 48 41 52 45 44 20 62 65 66 6f 72 65 20 69 74  SHARED before it
0f60: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0f70: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29  PAGER_RESERVED.)
0f80: 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69  .** The transiti
0f90: 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c  on to PAGER_EXCL
0fa0: 55 53 49 56 45 20 6f 63 63 75 72 73 20 77 68 65  USIVE occurs whe
0fb0: 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  n before any cha
0fc0: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
0fd0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0fe0: 20 66 69 6c 65 2e 20 20 41 66 74 65 72 20 61 6e   file.  After an
0ff0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
1000: 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73  llback().** or s
1010: 71 6c 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d 6d  qlite_pager_comm
1020: 69 74 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  it(), the state 
1030: 67 6f 65 73 20 62 61 63 6b 20 74 6f 20 50 41 47  goes back to PAG
1040: 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23 64  ER_SHARED..*/.#d
1050: 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f  efine PAGER_UNLO
1060: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
1070: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20  e PAGER_SHARED  
1080: 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20      1   /* same 
1090: 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  as SHARED_LOCK *
10a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
10b0: 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20  RESERVED    2   
10c0: 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52  /* same as RESER
10d0: 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  VED_LOCK */.#def
10e0: 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ine PAGER_EXCLUS
10f0: 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d  IVE   4   /* sam
1100: 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e as EXCLUSIVE_L
1110: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1120: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
1130: 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65   5../*.** If the
1140: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1150: 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f  ERVED_LOCK macro
1160: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1170: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
1180: 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20  .** then failed 
1190: 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20  attempts to get 
11a0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
11b0: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
11c0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  busy callback..*
11d0: 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79  * This is off by
11e0: 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65   default.  To se
11f0: 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20  e why, consider 
1200: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
1210: 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53  enario:.** .** S
1220: 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20  uppose thread A 
1230: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68  already has a sh
1240: 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  ared lock and wa
1250: 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  nts a reserved l
1260: 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42  ock..** Thread B
1270: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1280: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64  eserved lock and
1290: 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73   wants an exclus
12a0: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a  ive lock.  If.**
12b0: 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72   both threads ar
12c0: 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75  e using their bu
12d0: 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74  sy callbacks, it
12e0: 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67   might be a long
12f0: 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20   time.** be for 
1300: 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  one of the threa
1310: 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61  ds give up and a
1320: 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20  llows the other 
1330: 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42  to proceed..** B
1340: 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ut if the thread
1350: 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74   trying to get t
1360: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
1370: 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c   gives up quickl
1380: 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65  y.** (if it neve
1390: 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75  r invokes its bu
13a0: 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65  sy callback) the
13b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e  n the contention
13c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f   will be.** reso
13d0: 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f  lved quickly..*/
13e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13f0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1400: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
1410: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1420: 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a  _LOCK 0.#endif..
1430: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
1440: 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75   rounds values u
1450: 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  p so that if the
1460: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64   value is an add
1470: 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75  ress it.** is gu
1480: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1490: 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69  n address that i
14a0: 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20  s aligned to an 
14b0: 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  8-byte boundary.
14c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43  .*/.#define FORC
14d0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20  E_ALIGNMENT(X)  
14e0: 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f   (((X)+7)&~7)../
14f0: 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d  *.** Each in-mem
1500: 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70  ory image of a p
1510: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1520: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65  the following he
1530: 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65  ader..** This he
1540: 61 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73  ader is only vis
1550: 69 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67  ible to this pag
1560: 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20  er module.  The 
1570: 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74  client.** code t
1580: 68 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20  hat calls pager 
1590: 73 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61  sees only the da
15a0: 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
15b0: 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a  the header..**.*
15c0: 2a 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68  * Client code sh
15d0: 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65  ould call sqlite
15e0: 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 6f  3pager_write() o
15f0: 6e 20 61 20 70 61 67 65 20 70 72 69 6f 72 20 74  n a page prior t
1600: 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20  o making.** any 
1610: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
1620: 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 65   that page.  The
1630: 20 66 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69   first time sqli
1640: 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
1650: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  .** is called, t
1660: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
1670: 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 77 72   contents are wr
1680: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 72  itten into the r
1690: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e  ollback.** journ
16a0: 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a  al and PgHdr.inJ
16b0: 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72  ournal and PgHdr
16c0: 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20 73 65  .needSync are se
16d0: 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a  t.  Later, once.
16e0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70  ** the journal p
16f0: 61 67 65 20 68 61 73 20 6d 61 64 65 20 69 74 20  age has made it 
1700: 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75  onto the disk su
1710: 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e 65 65  rface, PgHdr.nee
1720: 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61  dSync.** is clea
1730: 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69 66 69  red.  The modifi
1740: 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62  ed page cannot b
1750: 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69  e written back i
1760: 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
1770: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
1780: 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72  e until the jour
1790: 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20 62 65  nal pages has be
17a0: 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  en synced to dis
17b0: 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48  k and the.** PgH
17c0: 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61 73 20  dr.needSync has 
17d0: 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a  been cleared..**
17e0: 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e 64 69  .** The PgHdr.di
17f0: 72 74 79 20 66 6c 61 67 20 69 73 20 73 65 74 20  rty flag is set 
1800: 77 68 65 6e 20 73 71 6c 69 74 65 33 70 61 67 65  when sqlite3page
1810: 72 5f 77 72 69 74 65 28 29 20 69 73 20 63 61 6c  r_write() is cal
1820: 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c  led and.** is cl
1830: 65 61 72 65 64 20 61 67 61 69 6e 20 77 68 65 6e  eared again when
1840: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1850: 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61 63  t is written bac
1860: 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  k to the origina
1870: 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  l.** database fi
1880: 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  le..*/.typedef s
1890: 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48 64  truct PgHdr PgHd
18a0: 72 3b 0a 73 74 72 75 63 74 20 50 67 48 64 72 20  r;.struct PgHdr 
18b0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
18c0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
18d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
18e0: 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 70 61  to which this pa
18f0: 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ge belongs */.  
1900: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1920: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
1930: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  r for this page 
1940: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
1950: 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73  tHash, *pPrevHas
1960: 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c  h;  /* Hash coll
1970: 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20  ision chain for 
1980: 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20  PgHdr.pgno */.  
1990: 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65  PgHdr *pNextFree
19a0: 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f  , *pPrevFree;  /
19b0: 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61  * Freelist of pa
19c0: 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
19d0: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  0 */.  PgHdr *pN
19e0: 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  extAll;         
19f0: 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20        /* A list 
1a00: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
1a10: 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74    PgHdr *pNextSt
1a20: 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20  mt, *pPrevStmt; 
1a30: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65   /* List of page
1a40: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
1a50: 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nt journal */.  
1a60: 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20  u8 inJournal;   
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a80: 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62 65  * TRUE if has be
1a90: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  en written to jo
1aa0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
1ab0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
1ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
1ad0: 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61 74  E if in the stat
1ae0: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
1af0: 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20   */.  u8 dirty; 
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
1b20: 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  we need to write
1b30: 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f   back changes */
1b40: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61    /* Sync journa
1b70: 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  l before writing
1b80: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
1b90: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
1ba0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
1bb0: 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72  * Disable dont_r
1bc0: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68  ollback() for th
1bd0: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 73 68 6f  is page */.  sho
1be0: 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  rt int nRef;    
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c00: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
1c10: 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  f this page */. 
1c20: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20   PgHdr *pDirty; 
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 73  /* Dirty pages s
1c50: 6f 72 74 65 64 20 62 79 20 50 67 48 64 72 2e 70  orted by PgHdr.p
1c60: 67 6e 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  gno */.#ifdef SQ
1c70: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1c80: 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b  .  u32 pageHash;
1c90: 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61  .#endif.  /* pPa
1ca0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
1cb0: 74 65 73 20 6f 66 20 70 61 67 65 20 64 61 74 61  tes of page data
1cc0: 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61   follow this hea
1cd0: 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65  der */.  /* Page
1ce0: 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f  r.nExtra bytes o
1cf0: 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c  f local data fol
1d00: 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64 61 74  low the page dat
1d10: 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46  a */.};../*.** F
1d20: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
1d30: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73  only database, s
1d40: 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d  ome extra inform
1d50: 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65  ation is recorde
1d60: 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20  d about.** each 
1d70: 70 61 67 65 20 73 6f 20 74 68 61 74 20 63 68 61  page so that cha
1d80: 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c  nges can be roll
1d90: 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e  ed back.  (Journ
1da0: 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74  al files are not
1db0: 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d  .** used for in-
1dc0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
1dd0: 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .)  The followin
1de0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  g information is
1df0: 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65   added to.** the
1e00: 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58   end of every EX
1e10: 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e  TRA block for in
1e20: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1e30: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  s..**.** This in
1e40: 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20  formation could 
1e50: 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20  have been added 
1e60: 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
1e70: 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65 2e  PgHdr structure.
1e80: 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20  .** But then it 
1e90: 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e  would take up an
1ea0: 20 65 78 74 72 61 20 38 20 62 79 74 65 73 20 6f   extra 8 bytes o
1eb0: 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65  f storage on eve
1ec0: 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e  ry PgHdr.** even
1ed0: 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20   for disk-based 
1ee0: 64 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69  databases.  Spli
1ef0: 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76  tting it out sav
1f00: 65 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 69  es 8 bytes.  Thi
1f10: 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73  s.** is only a s
1f20: 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62  avings of 0.8% b
1f30: 75 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74  ut those percent
1f40: 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a  ages add up..*/.
1f50: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
1f60: 67 48 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f  gHistory PgHisto
1f70: 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73  ry;.struct PgHis
1f80: 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72  tory {.  u8 *pOr
1f90: 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  ig;     /* Origi
1fa0: 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20  nal page text.  
1fb0: 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20  Restore to this 
1fc0: 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61  on a full rollba
1fd0: 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d  ck */.  u8 *pStm
1fe0: 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61  t;     /* Text a
1ff0: 73 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20  s it was at the 
2000: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
2010: 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
2020: 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  nt */.};../*.** 
2030: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
2040: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
2050: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
2060: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
2070: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
2080: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50 2c   define CODEC(P,
2090: 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43  D,N,X) if( P->xC
20a0: 6f 64 65 63 20 29 7b 20 50 2d 3e 78 43 6f 64 65  odec ){ P->xCode
20b0: 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44  c(P->pCodecArg,D
20c0: 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c 73 65 0a 23  ,N,X); }.#else.#
20d0: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50 2c   define CODEC(P,
20e0: 44 2c 4e 2c 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  D,N,X).#endif../
20f0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70  *.** Convert a p
2100: 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64  ointer to a PgHd
2110: 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  r into a pointer
2120: 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20   to its data.** 
2130: 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a  and back again..
2140: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  */.#define PGHDR
2150: 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76  _TO_DATA(P)  ((v
2160: 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a  oid*)(&(P)[1])).
2170: 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f  #define DATA_TO_
2180: 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50 67  PGHDR(D)  (&((Pg
2190: 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23  Hdr*)(D))[-1]).#
21a0: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
21b0: 45 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69  EXTRA(G,P) ((voi
21c0: 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 47  d*)&((char*)(&(G
21d0: 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65  )[1]))[(P)->page
21e0: 53 69 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50  Size]).#define P
21f0: 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50  GHDR_TO_HIST(P,P
2200: 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20  GR)  \.         
2210: 20 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29     ((PgHistory*)
2220: 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31  &((char*)(&(P)[1
2230: 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53  ]))[(PGR)->pageS
2240: 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72  ize+(PGR)->nExtr
2250: 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62  a])../*.** How b
2260: 69 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ig to make the h
2270: 61 73 68 20 74 61 62 6c 65 20 75 73 65 64 20 66  ash table used f
2280: 6f 72 20 6c 6f 63 61 74 69 6e 67 20 69 6e 2d 6d  or locating in-m
2290: 65 6d 6f 72 79 20 70 61 67 65 73 0a 2a 2a 20 62  emory pages.** b
22a0: 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54  y page number. T
22b0: 68 69 73 20 6d 61 63 72 6f 20 6c 6f 6f 6b 73 20  his macro looks 
22c0: 61 20 6c 69 74 74 6c 65 20 73 69 6c 6c 79 2c 20  a little silly, 
22d0: 62 75 74 20 69 73 20 65 76 61 6c 75 61 74 65 64  but is evaluated
22e0: 0a 2a 2a 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  .** at compile-t
22f0: 69 6d 65 2c 20 6e 6f 74 20 72 75 6e 2d 74 69 6d  ime, not run-tim
2300: 65 20 28 61 74 20 6c 65 61 73 74 20 66 6f 72 20  e (at least for 
2310: 67 63 63 20 74 68 69 73 20 69 73 20 74 72 75 65  gcc this is true
2320: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f  )..*/.#define N_
2330: 50 47 5f 48 41 53 48 20 28 5c 0a 20 20 28 4d 41  PG_HASH (\.  (MA
2340: 58 5f 50 41 47 45 53 3e 31 30 32 34 29 3f 32 30  X_PAGES>1024)?20
2350: 34 38 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47  48: \.  (MAX_PAG
2360: 45 53 3e 35 31 32 29 3f 31 30 32 34 3a 20 5c 0a  ES>512)?1024: \.
2370: 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 32 35 36    (MAX_PAGES>256
2380: 29 3f 35 31 32 3a 20 5c 0a 20 20 28 4d 41 58 5f  )?512: \.  (MAX_
2390: 50 41 47 45 53 3e 31 32 38 29 3f 32 35 36 3a 20  PAGES>128)?256: 
23a0: 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 36  \.  (MAX_PAGES>6
23b0: 34 29 3f 31 32 38 3a 36 34 20 5c 0a 29 0a 0a 2f  4)?128:64 \.)../
23c0: 2a 0a 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65  *.** Hash a page
23d0: 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69   number.*/.#defi
23e0: 6e 65 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e  ne pager_hash(PN
23f0: 29 20 20 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48  )  ((PN)&(N_PG_H
2400: 41 53 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41  ASH-1))../*.** A
2410: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
2420: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
2430: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2440: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
2450: 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20  truct Pager {.  
2460: 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20  u8 journalOpen; 
2470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2480: 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
2490: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
24a0: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38  is valid */.  u8
24b0: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
24c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
24d0: 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a  e if header of j
24e0: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
24f0: 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72   */.  u8 useJour
2500: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
2510: 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62    /* Use a rollb
2520: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  ack journal on t
2530: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  his file */.  u8
2540: 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20   noReadlock;    
2550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2560: 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62  not bother to ob
2570: 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a  tain readlocks *
2580: 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b  /.  u8 stmtOpen;
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
25b0: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
25c0: 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20  nal is open */. 
25d0: 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b 20 20   u8 stmtInUse;  
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25f0: 54 72 75 65 20 77 65 20 61 72 65 20 69 6e 20 61  True we are in a
2600: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
2610: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  ansaction */.  u
2620: 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20  8 stmtAutoopen; 
2630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
2640: 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20  en stmt journal 
2650: 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  when main journa
2660: 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20  l is opened*/.  
2670: 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20  u8 noSync;      
2680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2690: 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a  o not sync the j
26a0: 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a  ournal if true *
26b0: 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b  /.  u8 fullSync;
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63  /* Do extra sync
26e0: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
26f0: 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20   for robustness 
2700: 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20  */.  u8 state;  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   /* PAGER_UNLOCK
2730: 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45  , _SHARED, _RESE
2740: 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20  RVED, etc. */.  
2750: 75 38 20 65 72 72 4d 61 73 6b 3b 20 20 20 20 20  u8 errMask;     
2760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2770: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
2780: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
2790: 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20  .  u8 tempFile; 
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27b0: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61  * zFilename is a
27c0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
27d0: 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79  */.  u8 readOnly
27e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27f0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72   /* True for a r
2800: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
2810: 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  e */.  u8 needSy
2820: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2830: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2840: 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64   fsync() is need
2850: 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
2860: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43  l */.  u8 dirtyC
2870: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
2880: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
2890: 63 68 65 64 20 70 61 67 65 73 20 68 61 76 65 20  ched pages have 
28a0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20  changed */.  u8 
28b0: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20  alwaysRollback; 
28c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
28d0: 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ble dont_rollbac
28e0: 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65  k() for all page
28f0: 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b  s */.  u8 memDb;
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e     /* True to in
2920: 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49  hibit all file I
2930: 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61  /O */.  u8 setMa
2940: 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
2950: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2960: 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65   m-j name has be
2970: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72  en written to jr
2980: 6e 6c 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69  nl */.  int dbSi
2990: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
29a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29b0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
29c0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67  le */.  int orig
29d0: 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  DbSize;         
29e0: 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65      /* dbSize be
29f0: 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
2a00: 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74   change */.  int
2a10: 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20   stmtSize;      
2a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2a30: 20 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 6e   of database (in
2a40: 20 70 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f   pages) at stmt_
2a50: 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  begin() */.  int
2a60: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
2a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a80: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
2a90: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2aa0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
2ab0: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  mInit;          
2ac0: 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e      /* Quasi-ran
2ad0: 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20  dom value added 
2ae0: 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75  to every checksu
2af0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e  m */.  int stmtN
2b00: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
2b10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b20: 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20  records in stmt 
2b30: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  subjournal */.  
2b40: 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20  int nExtra;     
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2b60: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
2b70: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
2b80: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
2b90: 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20  nt pageSize;    
2ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2bb0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2bc0: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
2bd0: 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
2be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
2bf0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  l number of in-m
2c00: 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20  emory pages */. 
2c10: 20 69 6e 74 20 6e 4d 61 78 50 61 67 65 3b 20 20   int nMaxPage;  
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c30: 48 69 67 68 20 77 61 74 65 72 20 6d 61 72 6b 20  High water mark 
2c40: 6f 66 20 6e 50 61 67 65 20 2a 2f 0a 20 20 69 6e  of nPage */.  in
2c50: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
2c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2c70: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2c80: 20 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64   pages with PgHd
2c90: 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e  r.nRef>0 */.  in
2ca0: 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20  t mxPage;       
2cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2cc0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70  imum number of p
2cd0: 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20  ages to hold in 
2ce0: 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 2a 61  cache */.  u8 *a
2cf0: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
2d00: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
2d10: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
2d20: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2d30: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49  file */.  u8 *aI
2d40: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
2d50: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2d60: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2d70: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
2d80: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
2d90: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
2da0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2db0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2dc0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
2dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2de0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
2df0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
2e00: 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b  har *zDirectory;
2e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
2e20: 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74  rectory hold dat
2e30: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
2e40: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46  l files */.  OsF
2e50: 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20  ile *fd, *jfd;  
2e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2e70: 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
2e80: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
2e90: 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c  urnal */.  OsFil
2ea0: 65 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20  e *stfd;        
2eb0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2ec0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
2ed0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
2ee0: 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48  ournal*/.  BusyH
2ef0: 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
2f00: 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65  dler;  /* Pointe
2f10: 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79  r to sqlite.busy
2f20: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48  Handler */.  PgH
2f30: 64 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61  dr *pFirst, *pLa
2f40: 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
2f50: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a   of free pages *
2f60: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
2f70: 74 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20  tSynced;        
2f80: 2f 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61  /* First free pa
2f90: 67 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65  ge with PgHdr.ne
2fa0: 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50  edSync==0 */.  P
2fb0: 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20  gHdr *pAll;     
2fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2fd0: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
2fe0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d  */.  PgHdr *pStm
2ff0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3000: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65   /* List of page
3010: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
3020: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  nt subjournal */
3030: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66  .  i64 journalOf
3040: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
3050: 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f  * Current byte o
3060: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
3070: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
3080: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
3090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
30a0: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
30b0: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
30c0: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74  ader */.  i64 st
30d0: 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20  mtHdrOff;       
30e0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a        /* First j
30f0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72  ournal header wr
3100: 69 74 74 65 6e 20 74 68 69 73 20 73 74 61 74 65  itten this state
3110: 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74  ment */.  i64 st
3120: 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  mtCksum;        
3130: 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e        /* cksumIn
3140: 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e  it when statemen
3150: 74 20 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f  t was started */
3160: 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65  .  i64 stmtJSize
3170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3180: 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61  * Size of journa
3190: 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28  l at stmt_begin(
31a0: 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f  ) */.  int secto
31b0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
31c0: 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65     /* Assumed se
31d0: 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67  ctor size during
31e0: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66   rollback */.#if
31f0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
3200: 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73    int nHit, nMis
3210: 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f 2a  s, nOvfl;     /*
3220: 20 43 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73   Cache hits, mis
3230: 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f 76  sing, and LRU ov
3240: 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 69 6e 74  erflows */.  int
3250: 20 6e 52 65 61 64 2c 6e 57 72 69 74 65 3b 20 20   nRead,nWrite;  
3260: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
3270: 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f  base pages read/
3280: 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69  written */.#endi
3290: 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  f.  void (*xDest
32a0: 72 75 63 74 6f 72 29 28 76 6f 69 64 2a 2c 69 6e  ructor)(void*,in
32b0: 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  t); /* Call this
32c0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72   routine when fr
32d0: 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20  eeing pages */. 
32e0: 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65   void (*xReinite
32f0: 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 20  r)(void*,int);  
3300: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
3310: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
3320: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
3330: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76  void (*xCodec)(v
3340: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
3350: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
3360: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
3370: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
3380: 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20  *pCodecArg;     
3390: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
33a0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
33b0: 65 63 28 29 20 2a 2f 0a 20 20 50 67 48 64 72 20  ec() */.  PgHdr 
33c0: 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48  *aHash[N_PG_HASH
33d0: 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61  ];    /* Hash ta
33e0: 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20  ble to map page 
33f0: 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20  number to PgHdr 
3400: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  */.};../*.** If 
3410: 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64  SQLITE_TEST is d
3420: 65 66 69 6e 65 64 20 74 68 65 6e 20 69 6e 63 72  efined then incr
3430: 65 6d 65 6e 74 20 74 68 65 20 76 61 72 69 61 62  ement the variab
3440: 6c 65 20 67 69 76 65 6e 20 69 6e 0a 2a 2a 20 74  le given in.** t
3450: 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 23  he argument.*/.#
3460: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3470: 54 0a 23 20 64 65 66 69 6e 65 20 54 45 53 54 5f  T.# define TEST_
3480: 49 4e 43 52 28 78 29 20 20 78 2b 2b 0a 23 65 6c  INCR(x)  x++.#el
3490: 73 65 0a 23 20 64 65 66 69 6e 65 20 54 45 53 54  se.# define TEST
34a0: 5f 49 4e 43 52 28 78 29 0a 23 65 6e 64 69 66 0a  _INCR(x).#endif.
34b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  ./*.** These are
34c0: 20 62 69 74 73 20 74 68 61 74 20 63 61 6e 20 62   bits that can b
34d0: 65 20 73 65 74 20 69 6e 20 50 61 67 65 72 2e 65  e set in Pager.e
34e0: 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69  rrMask..*/.#defi
34f0: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  ne PAGER_ERR_FUL
3500: 4c 20 20 20 20 20 30 78 30 31 20 20 2f 2a 20 61  L     0x01  /* a
3510: 20 77 72 69 74 65 28 29 20 66 61 69 6c 65 64 20   write() failed 
3520: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
3530: 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20 20 30 78  _ERR_MEM      0x
3540: 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20  02  /* malloc() 
3550: 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e  failed */.#defin
3560: 65 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b  e PAGER_ERR_LOCK
3570: 20 20 20 20 20 30 78 30 34 20 20 2f 2a 20 65 72       0x04  /* er
3580: 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ror in the locki
3590: 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23  ng protocol */.#
35a0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
35b0: 5f 43 4f 52 52 55 50 54 20 20 30 78 30 38 20 20  _CORRUPT  0x08  
35c0: 2f 2a 20 64 61 74 61 62 61 73 65 20 6f 72 20 6a  /* database or j
35d0: 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
35e0: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  n */.#define PAG
35f0: 45 52 5f 45 52 52 5f 44 49 53 4b 20 20 20 20 20  ER_ERR_DISK     
3600: 30 78 31 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c  0x10  /* general
3610: 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
3620: 2d 20 62 61 64 20 68 61 72 64 20 64 72 69 76 65  - bad hard drive
3630: 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  ? */../*.** Jour
3640: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
3650: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
3660: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
3670: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
3680: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
3690: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
36a0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
36b0: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
36c0: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
36d0: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
36e0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
36f0: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
3700: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
3710: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
3720: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
3730: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
3740: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69   journal is begi
3750: 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  n.** written, se
3760: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
3770: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
3780: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
3790: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
37a0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
37b0: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
37c0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
37d0: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
37e0: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
37f0: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
3800: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
3810: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
3820: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
3830: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
3840: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
3850: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
3860: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
3870: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
3880: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
3890: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
38a0: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
38b0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
38c0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
38d0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
38e0: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
38f0: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
3900: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
3910: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
3920: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
3930: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
3940: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
3950: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
3960: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
3970: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
3980: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
3990: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
39a0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
39b0: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
39c0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
39d0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
39e0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
39f0: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
3a00: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
3a10: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
3a20: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
3a30: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
3a40: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
3a50: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
3a60: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
3a70: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
3a80: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
3a90: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
3aa0: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
3ab0: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
3ac0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
3ad0: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
3ae0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
3af0: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
3b00: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
3b10: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
3b20: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
3b30: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
3b40: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
3b50: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
3b60: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
3b70: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
3b80: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
3b90: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
3ba0: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
3bb0: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
3bc0: 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  f the header and
3bd0: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e   of each page in
3be0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3bf0: 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79  determined.** by
3c00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
3c10: 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  acros..*/.#defin
3c20: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
3c30: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
3c40: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
3c50: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
3c60: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
3c70: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
3c80: 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   In the future, 
3c90: 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  this could be.**
3ca0: 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c   set to some val
3cb0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
3cc0: 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72   disk controller
3cd0: 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a  . The important.
3ce0: 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ** characteristi
3cf0: 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20  c is that it is 
3d00: 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73  the same size as
3d10: 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a   a disk sector..
3d20: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
3d30: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
3d40: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
3d50: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
3d60: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
3d70: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
3d80: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
3d90: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
3da0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
3db0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
3dc0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
3dd0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
3de0: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
3df0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
3e00: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
3e10: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
3e20: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
3e30: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
3e40: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
3e50: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
3e60: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
3e70: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
3e80: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
3e90: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
3ea0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
3eb0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
3ec0: 65 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f  e default size o
3ed0: 66 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 0a  f a disk sector.
3ee0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
3ef0: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 35 31 32  _SECTOR_SIZE 512
3f00: 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d  ../*.** Page num
3f10: 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ber PAGER_MJ_PGN
3f20: 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  O is never used 
3f30: 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
3f40: 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20  abase (it is.** 
3f50: 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72  reserved for wor
3f60: 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69  king around a wi
3f70: 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f  ndows/posix inco
3f80: 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74  mpatibility). It
3f90: 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74   is.** used in t
3fa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69  he journal to si
3fb0: 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72  gnify that the r
3fc0: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
3fd0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
3fe0: 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73   is devoted to s
3ff0: 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20  toring a master 
4000: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74  journal name - t
4010: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
4020: 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c   pages to.** rol
4030: 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d  l back. See comm
4040: 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f  ents for functio
4050: 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  n writeMasterJou
4060: 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69  rnal() for detai
4070: 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e  ls..*/./* #defin
4080: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
4090: 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  x) (PENDING_BYTE
40a0: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
40b0: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ) */.#define PAG
40c0: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28  ER_MJ_PGNO(x) ((
40d0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78  PENDING_BYTE/((x
40e0: 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29  )->pageSize))+1)
40f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
4100: 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  mum legal page n
4110: 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d  umber is (2^31 -
4120: 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   1)..*/.#define 
4130: 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32  PAGER_MAX_PGNO 2
4140: 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a  147483647../*.**
4150: 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63   Enable referenc
4160: 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67  e count tracking
4170: 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29   (for debugging)
4180: 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66   here:.*/.#ifdef
4190: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
41a0: 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e  int pager3_refin
41b0: 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20  fo_enable = 0;. 
41c0: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
41d0: 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72  er_refinfo(PgHdr
41e0: 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63   *p){.    static
41f0: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
4200: 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65    if( !pager3_re
4210: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72  finfo_enable ) r
4220: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
4230: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
4240: 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25        "REFCNT: %
4250: 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d  4d addr=%p nRef=
4260: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d  %d\n",.       p-
4270: 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
4280: 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66  DATA(p), p->nRef
4290: 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b  .    );.    cnt+
42a0: 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e  +;   /* Somethin
42b0: 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  g to set a break
42c0: 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a  point on */.  }.
42d0: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
42e0: 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e  (X)  pager_refin
42f0: 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  fo(X).#else.# de
4300: 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a  fine REFINFO(X).
4310: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
4320: 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ad a 32-bit inte
4330: 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76  ger from the giv
4340: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
4350: 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69  or.  Store the i
4360: 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69  nteger.** that i
4370: 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e  s read in *pRes.
4380: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4390: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
43a0: 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a   worked, or an.*
43b0: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
43c0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
43d0: 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rong..**.** All 
43e0: 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65  values are store
43f0: 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67  d on disk as big
4400: 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74  -endian..*/.stat
4410: 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74  ic int read32bit
4420: 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33  s(OsFile *fd, u3
4430: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 33 32 20  2 *pRes){.  u32 
4440: 72 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  res;.  int rc;. 
4450: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e   rc = sqlite3Io.
4460: 78 52 65 61 64 28 66 64 2c 20 26 72 65 73 2c 20  xRead(fd, &res, 
4470: 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a 20 20  sizeof(res));.  
4480: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4490: 4b 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65  K ){.    unsigne
44a0: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
44b0: 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72 65    memcpy(ac, &re
44c0: 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20 3d  s, 4);.    res =
44d0: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
44e0: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
44f0: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
4500: 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72  .  }.  *pRes = r
4510: 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  es;.  return rc;
4520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
4530: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4540: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
4550: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4560: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4570: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
4580: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
4590: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
45a0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
45b0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
45c0: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
45d0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73   u32 val){.  uns
45e0: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
45f0: 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c  ;.  ac[0] = (val
4600: 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20  >>24) & 0xff;.  
4610: 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  ac[1] = (val>>16
4620: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32  ) & 0xff;.  ac[2
4630: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
4640: 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76  xff;.  ac[3] = v
4650: 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 72 65 74  al & 0xff;.  ret
4660: 75 72 6e 20 73 71 6c 69 74 65 33 49 6f 2e 78 57  urn sqlite3Io.xW
4670: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b  rite(fd, ac, 4);
4680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
4690: 74 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67  the 32-bit integ
46a0: 65 72 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68  er 'val' into th
46b0: 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
46c0: 64 20 62 79 20 70 61 67 65 20 68 65 61 64 65 72  d by page header
46d0: 0a 2a 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65  .** 'p' at offse
46e0: 74 20 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73  t 'offset'..*/.s
46f0: 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65  tatic void store
4700: 33 32 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20  32bits(u32 val, 
4710: 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66  PgHdr *p, int of
4720: 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  fset){.  unsigne
4730: 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63  d char *ac;.  ac
4740: 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63   = &((unsigned c
4750: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
4760: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
4770: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
4780: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  24) & 0xff;.  ac
4790: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
47a0: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20  & 0xff;.  ac[2] 
47b0: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
47c0: 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c  f;.  ac[3] = val
47d0: 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
47e0: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
47f0: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
4800: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
4810: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
4820: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
4830: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
4840: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
4850: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
4860: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
4870: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4880: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
4890: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
48a0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
48b0: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
48c0: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
48d0: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
48e0: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
48f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
4900: 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  rt the bits in t
4910: 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  he pPager->errMa
4920: 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f  sk into an appro
4930: 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20  prate.** return 
4940: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
4950: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64  int pager_errcod
4960: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
4970: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
4980: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
4990: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
49a0: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29  PAGER_ERR_LOCK )
49b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
49c0: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20  PROTOCOL;.  if( 
49d0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
49e0: 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  & PAGER_ERR_DISK
49f0: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
4a00: 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70  E_IOERR;.  if( p
4a10: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
4a20: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20   PAGER_ERR_FULL 
4a30: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
4a40: 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61  _FULL;.  if( pPa
4a50: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
4a60: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20  AGER_ERR_MEM )  
4a70: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4a80: 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67  OMEM;.  if( pPag
4a90: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
4aa0: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
4ab0: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
4ac0: 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  RRUPT;.  return 
4ad0: 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
4ae0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
4af0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
4b00: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
4b10: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
4b20: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
4b30: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
4b40: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
4b50: 65 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  e){.  u32 hash =
4b60: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75   0;.  int i;.  u
4b70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
4b80: 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
4b90: 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f  char *)PGHDR_TO_
4ba0: 44 41 54 41 28 70 50 61 67 65 29 3b 0a 20 20 66  DATA(pPage);.  f
4bb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
4bc0: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
4bd0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
4be0: 68 20 3d 20 28 68 61 73 68 2b 69 29 5e 70 44 61  h = (hash+i)^pDa
4bf0: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
4c00: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a  urn hash;.}../*.
4c10: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
4c20: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
4c30: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
4c40: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
4c50: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
4c60: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
4c70: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
4c80: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
4c90: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
4ca0: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
4cb0: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
4cc0: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
4cd0: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
4ce0: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
4cf0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
4d00: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
4d10: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
4d20: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
4d30: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
4d40: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
4d50: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
4d60: 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68  ( !pPg->pageHash
4d70: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   || pPager->errM
4d80: 61 73 6b 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  ask || MEMDB || 
4d90: 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20  pPg->dirty || . 
4da0: 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
4db0: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
4dc0: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
4dd0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 43 48 45 43  lse.#define CHEC
4de0: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
4df0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
4e00: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
4e10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
4e20: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
4e30: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
4e40: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
4e50: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72  l file name is r
4e60: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ead from the end
4e70: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
4e80: 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74   .** written int
4e90: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4ea0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
4eb0: 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72  loc(). *pzMaster
4ec0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f   is.** set to po
4ed0: 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72  int at the memor
4ee0: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  y and SQLITE_OK 
4ef0: 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
4f00: 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c  ller must.** sql
4f10: 69 74 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73  iteFree() *pzMas
4f20: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ter..**.** If no
4f30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
4f40: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
4f50: 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69  sent *pzMaster i
4f60: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
4f70: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
4f80: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
4f90: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
4fa0: 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a  urnal(OsFile *pJ
4fb0: 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61  rnl, char **pzMa
4fc0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
4fd0: 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36  .  u32 len;.  i6
4fe0: 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73  4 szJ;.  u32 cks
4ff0: 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  um;.  int i;.  u
5000: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
5010: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
5020: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
5030: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
5040: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30  .  *pzMaster = 0
5050: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
5060: 33 49 6f 2e 78 46 69 6c 65 53 69 7a 65 28 70 4a  3Io.xFileSize(pJ
5070: 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  rnl, &szJ);.  if
5080: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5090: 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75  || szJ<16 ) retu
50a0: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
50b0: 71 6c 69 74 65 33 49 6f 2e 78 53 65 65 6b 28 70  qlite3Io.xSeek(p
50c0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20  Jrnl, szJ-16);. 
50d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
50e0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
50f0: 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62   .  rc = read32b
5100: 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29  its(pJrnl, &len)
5110: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5120: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5130: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
5140: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b  2bits(pJrnl, &ck
5150: 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
5160: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
5170: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
5180: 71 6c 69 74 65 33 49 6f 2e 78 52 65 61 64 28 70  qlite3Io.xRead(p
5190: 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29  Jrnl, aMagic, 8)
51a0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
51b0: 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28  TE_OK || memcmp(
51c0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
51d0: 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75  Magic, 8) ) retu
51e0: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
51f0: 71 6c 69 74 65 33 49 6f 2e 78 53 65 65 6b 28 70  qlite3Io.xSeek(p
5200: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e  Jrnl, szJ-16-len
5210: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5220: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
5230: 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72  rc;..  *pzMaster
5240: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
5250: 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a  eMalloc(len+1);.
5260: 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72    if( !*pzMaster
5270: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5280: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
5290: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49  .  rc = sqlite3I
52a0: 6f 2e 78 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a  o.xRead(pJrnl, *
52b0: 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a  pzMaster, len);.
52c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
52d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
52e0: 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29  eFree(*pzMaster)
52f0: 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20  ;.    *pzMaster 
5300: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
5310: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
5320: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
5330: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
5340: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
5350: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
5360: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
5370: 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61   cksum -= (*pzMa
5380: 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20  ster)[i];.  }.  
5390: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
53a0: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
53b0: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
53c0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
53d0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
53e0: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
53f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
5400: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5410: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
5420: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
5430: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
5440: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
5450: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
5460: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
5470: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
5480: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
5490: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
54a0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a      sqliteFree(*
54b0: 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a  pzMaster);.    *
54c0: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  pzMaster = 0;.  
54d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d  }else{.    (*pzM
54e0: 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c  aster)[len] = '\
54f0: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
5500: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5510: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
5520: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
5530: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
5540: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
5550: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
5560: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5570: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
5580: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
5590: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
55a0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
55b0: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
55c0: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
55d0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
55e0: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
55f0: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
5600: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
5610: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
5640: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
5650: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
5660: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
5670: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
5680: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
5690: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
56a0: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
56c0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
56d0: 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  nt seekJournalHd
56e0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
56f0: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
5700: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
5710: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5720: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
5730: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
5740: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
5750: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
5760: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5770: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
5780: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
5790: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
57a0: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
57b0: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
57c0: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
57d0: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
57e0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
57f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5800: 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20  Off = offset;.  
5810: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6f  return sqlite3Io
5820: 2e 78 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  .xSeek(pPager->j
5830: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
5840: 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalOff);.}../*.*
5850: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
5860: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
5870: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
5880: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
5890: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
58a0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
58b0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
58c0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
58d0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
58e0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
58f0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
5900: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
5910: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
5920: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
5930: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
5940: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
5950: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
5960: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
5970: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
5980: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
5990: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
59a0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
59b0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
59c0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
59d0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
59e0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
59f0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
5a00: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
5a10: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
5a20: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
5a30: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
5a40: 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f  al..** .** Follo
5a50: 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f  wed by (JOURNAL_
5a60: 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74  HDR_SZ - 24) byt
5a70: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
5a80: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
5a90: 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  t writeJournalHd
5aa0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
5ab0: 7b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 65  {..  int rc = se
5ac0: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
5ad0: 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ger);.  if( rc )
5ae0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
5af0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
5b00: 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
5b10: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 70 50  nalOff;.  if( pP
5b20: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
5b30: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ==0 ){.    pPage
5b40: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
5b50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
5b60: 64 72 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  dr;.  }.  pPager
5b70: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
5b80: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5b90: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49  Pager);..  /* FI
5ba0: 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a  X ME: .  **.  **
5bb0: 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61 20   Possibly for a 
5bc0: 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d  pager not in no-
5bd0: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a  sync mode, the j
5be0: 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f  ournal magic sho
5bf0: 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20  uld not.  ** be 
5c00: 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52  written until nR
5c10: 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20  ec is filled in 
5c20: 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74 20  as part of next 
5c30: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a  syncJournal(). .
5c40: 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
5c50: 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77 68 6f  ly maybe the who
5c60: 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  le journal heade
5c70: 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 61  r should be dela
5c80: 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a 20  yed until that. 
5c90: 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b   ** point. Think
5ca0: 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a   about this..  *
5cb0: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
5cc0: 49 6f 2e 78 57 72 69 74 65 28 70 50 61 67 65 72  Io.xWrite(pPager
5cd0: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
5ce0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
5cf0: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20  urnalMagic));.. 
5d00: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5d10: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
5d20: 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46   nRec Field. 0xF
5d30: 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73  FFFFFFF for no-s
5d40: 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f  ync journals. */
5d50: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
5d60: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
5d70: 64 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  d, pPager->noSyn
5d80: 63 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  c ? 0xffffffff :
5d90: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
5da0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5db0: 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f      /* The rando
5dc0: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
5dd0: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 20  tialiser */ .   
5de0: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
5df0: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
5e00: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
5e10: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
5e20: 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  );.    rc = writ
5e30: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
5e40: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  jfd, pPager->cks
5e50: 75 6d 49 6e 69 74 29 3b 0a 20 20 7d 0a 20 20 69  umInit);.  }.  i
5e60: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5e70: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 69   ){.    /* The i
5e80: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
5e90: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  size */.    rc =
5ea0: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
5eb0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
5ec0: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  ->dbSize);.  }. 
5ed0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5ee0: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
5ef0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
5f00: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
5f10: 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 72 63 20  ocess */.    rc 
5f20: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
5f30: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
5f40: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
5f50: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f    }..  /* The jo
5f60: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73  urnal header has
5f70: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75   been written su
5f80: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b  ccessfully. Seek
5f90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
5fa0: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
5fb0: 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
5fc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
5fd0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a  er sector..  */.
5fe0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5ff0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
6000: 73 71 6c 69 74 65 33 49 6f 2e 78 53 65 65 6b 28  sqlite3Io.xSeek(
6010: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
6020: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
6030: 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  1);.    if( rc==
6040: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6050: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49     rc = sqlite3I
6060: 6f 2e 78 57 72 69 74 65 28 70 50 61 67 65 72 2d  o.xWrite(pPager-
6070: 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29  >jfd, "\000", 1)
6080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6090: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
60a0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
60b0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
60c0: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
60d0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
60e0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
60f0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
6100: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
6110: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
6120: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
6130: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53  urnal.** file. S
6140: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
6150: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
6160: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
6170: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
6180: 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  f.** the journal
6190: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
61a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
61b0: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
61c0: 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20  essfully, *nRec 
61d0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
61e0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
61f0: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
6200: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
6210: 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74  d *dbSize is set
6220: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
6230: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
6240: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
6250: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
6260: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
6270: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
6280: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
6290: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
62a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
62b0: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
62c0: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
62d0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
62e0: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
62f0: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
6300: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
6310: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
6320: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
6330: 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a   and *nRec and *
6340: 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73  dbSize are not s
6350: 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  et.  If JOURNAL_
6360: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
6370: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
6380: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
6390: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
63a0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
63b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
63c0: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
63d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a  Pager *pPager, .
63e0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
63f0: 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c  e,.  u32 *pNRec,
6400: 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65   .  u32 *pDbSize
6410: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
6420: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
6430: 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75  agic[8]; /* A bu
6440: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
6450: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
6460: 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75  ..  rc = seekJou
6470: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
6480: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
6490: 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  rn rc;..  if( pP
64a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
64b0: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
64c0: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
64d0: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
64e0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
64f0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
6500: 69 74 65 33 49 6f 2e 78 52 65 61 64 28 70 50 61  ite3Io.xRead(pPa
6510: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
6520: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
6530: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6540: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
6550: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
6560: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
6570: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
6580: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
6590: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
65a0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
65b0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
65c0: 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63  pNRec);.  if( rc
65d0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
65e0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
65f0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
6600: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6610: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6620: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
6630: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
6640: 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65  er->jfd, pDbSize
6650: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6660: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55  turn rc;..  /* U
6670: 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
6680: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
6690: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
66a0: 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
66b0: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
66c0: 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
66d0: 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
66e0: 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63  urnal was.  ** c
66f0: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
6700: 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
6710: 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
6720: 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20  is routine.  ** 
6730: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
6740: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
6750: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
6760: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
6770: 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74  ** of Pager.sect
6780: 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72  orSize is restor
6790: 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
67a0: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20   that routine.. 
67b0: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33   */.  rc = read3
67c0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
67d0: 64 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65  d, (u32 *)&pPage
67e0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
67f0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6800: 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d  n rc;..  pPager-
6810: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
6820: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6830: 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ager);.  rc = sq
6840: 6c 69 74 65 33 49 6f 2e 78 53 65 65 6b 28 70 50  lite3Io.xSeek(pP
6850: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
6860: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
6870: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6880: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
6890: 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
68a0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
68b0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
68c0: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
68d0: 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
68e0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
68f0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
6900: 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
6910: 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
6920: 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
6930: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
6940: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
6950: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
6960: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
6970: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6980: 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
6990: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
69a0: 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
69b0: 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
69c0: 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
69d0: 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20  t is:.**.** + 4 
69e0: 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
69f0: 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74  PGNO..** + N byt
6a00: 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61  es: length of ma
6a10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6a20: 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  e..** + 4 bytes:
6a30: 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a   N.** + 4 bytes:
6a40: 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
6a50: 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  name checksum..*
6a60: 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f  * + 8 bytes: aJo
6a70: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
6a80: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
6a90: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
6aa0: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
6ab0: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
6ac0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
6ad0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  urnal name..*/.s
6ae0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
6af0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
6b00: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
6b10: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
6b20: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
6b30: 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b  t len; .  int i;
6b40: 20 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20   .  u32 cksum = 
6b50: 30 3b 20 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73  0; ..  if( !zMas
6b60: 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ter || pPager->s
6b70: 65 74 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e  etMaster) return
6b80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
6b90: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
6ba0: 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74  = 1;..  len = st
6bb0: 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20  rlen(zMaster);. 
6bc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b   for(i=0; i<len;
6bd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   i++){.    cksum
6be0: 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a   += zMaster[i];.
6bf0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20    }..  /* If in 
6c00: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
6c10: 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
6c20: 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
6c30: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
6c40: 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
6c50: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
6c60: 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
6c70: 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
6c80: 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
6c90: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
6ca0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
6cb0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
6cc0: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
6cd0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65 6b  ){.    rc = seek
6ce0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
6cf0: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
6d00: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
6d10: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
6d20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
6d30: 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20  += (len+20);..  
6d40: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
6d50: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41  (pPager->jfd, PA
6d60: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
6d70: 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  er));.  if( rc!=
6d80: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
6d90: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
6da0: 71 6c 69 74 65 33 49 6f 2e 78 57 72 69 74 65 28  qlite3Io.xWrite(
6db0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
6dc0: 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66  ster, len);.  if
6dd0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6de0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6df0: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
6e00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6c 65  (pPager->jfd, le
6e10: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
6e20: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6e30: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69   rc;..  rc = wri
6e40: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
6e50: 3e 6a 66 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  >jfd, cksum);.  
6e60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6e70: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
6e80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f    rc = sqlite3Io
6e90: 2e 78 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  .xWrite(pPager->
6ea0: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
6eb0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
6ec0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50  nalMagic));.  pP
6ed0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
6ee0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
6ef0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
6f00: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
6f10: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
6f20: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
6f30: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
6f40: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
6f50: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
6f60: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
6f70: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
6f80: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
6f90: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
6fa0: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
6fb0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
6fc0: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
6fd0: 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
6fe0: 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69  ommit().** routi
6ff0: 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74  ne run MUCH fast
7000: 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  er for the commo
7010: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
7020: 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70  re are many.** p
7030: 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62  ages in memory b
7040: 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72  ut only a few ar
7050: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
7060: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  nt journal..*/.s
7070: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
7080: 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
7090: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
70a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
70b0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
70c0: 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  f( pPg->inStmt )
70d0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
70e0: 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  t( pPg->pPrevStm
70f0: 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65  t==0 && pPg->pNe
7100: 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70  xtStmt==0 );.  p
7110: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
7120: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
7130: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50  >pStmt ){.    pP
7140: 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72  ager->pStmt->pPr
7150: 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  evStmt = pPg;.  
7160: 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  }.  pPg->pNextSt
7170: 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74  mt = pPager->pSt
7180: 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53  mt;.  pPager->pS
7190: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67  tmt = pPg;.  pPg
71a0: 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a  ->inStmt = 1;.}.
71b0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
71c0: 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d  _remove_from_stm
71d0: 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50  t_list(PgHdr *pP
71e0: 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  g){.  if( !pPg->
71f0: 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b  inStmt ) return;
7200: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
7210: 76 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  vStmt ){.    ass
7220: 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53  ert( pPg->pPrevS
7230: 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  tmt->pNextStmt==
7240: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
7250: 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74  pPrevStmt->pNext
7260: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
7270: 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tStmt;.  }else{.
7280: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
7290: 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d  >pPager->pStmt==
72a0: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
72b0: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
72c0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
72d0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
72e0: 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20  NextStmt ){.    
72f0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
7300: 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  xtStmt->pPrevStm
7310: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
7320: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50  g->pNextStmt->pP
7330: 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
7340: 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20  PrevStmt;.  }.  
7350: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
7360: 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   0;.  pPg->pPrev
7370: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d  Stmt = 0;.  pPg-
7380: 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a  >inStmt = 0;.}..
7390: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
73a0: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
73b0: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
73c0: 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ge number.  Retu
73d0: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
73e0: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
73f0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
7400: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
7410: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
7420: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
7430: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
7440: 64 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e  dr *p = pPager->
7450: 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68  aHash[pager_hash
7460: 28 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65  (pgno)];.  while
7470: 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d  ( p && p->pgno!=
7480: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20  pgno ){.    p = 
7490: 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  p->pNextHash;.  
74a0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
74b0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
74c0: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  e database and c
74d0: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
74e0: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
74f0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
7500: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
7510: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
7520: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
7530: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
7540: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
7550: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
7560: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
7570: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
7580: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
7590: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
75a0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
75b0: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
75c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
75d0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
75e0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
75f0: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
7600: 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  t;.  if( pPager-
7610: 3e 65 72 72 4d 61 73 6b 20 29 20 72 65 74 75 72  >errMask ) retur
7620: 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  n;.  for(pPg=pPa
7630: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
7640: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
7650: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
7660: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
7670: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
7680: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
7690: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
76a0: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
76b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
76c0: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
76d0: 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d  >pAll = 0;.  mem
76e0: 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
76f0: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
7700: 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20  ger->aHash));.  
7710: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
7720: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
7730: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
7740: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
7750: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
7760: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
7770: 0a 20 20 73 71 6c 69 74 65 33 49 6f 2e 78 55 6e  .  sqlite3Io.xUn
7780: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
7790: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61   NO_LOCK);.  pPa
77a0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
77b0: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61  ER_UNLOCK;.  pPa
77c0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
77d0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
77e0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
77f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7800: 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  pen==0 );.}../*.
7810: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
7820: 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 73 65   is used to rese
7830: 74 20 74 68 65 20 70 61 67 65 72 20 61 66 74 65  t the pager afte
7840: 72 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  r a malloc() fai
7850: 6c 75 72 65 2e 20 54 68 69 73 0a 2a 2a 20 64 6f  lure. This.** do
7860: 65 73 6e 27 74 20 77 6f 72 6b 20 77 69 74 68 20  esn't work with 
7870: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
7880: 73 65 73 2e 20 49 66 20 61 20 6d 61 6c 6c 6f 63  ses. If a malloc
7890: 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 61 6e  () fails when an
78a0: 20 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   .** in-memory d
78b0: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 75 73  atabase is in us
78c0: 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
78d0: 69 62 6c 65 20 74 6f 20 72 65 63 6f 76 65 72 2e  ible to recover.
78e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
78f0: 73 61 63 74 69 6f 6e 20 6f 72 20 73 74 61 74 65  saction or state
7900: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
7910: 20 69 73 20 61 63 74 69 76 65 2c 20 69 74 20 69   is active, it i
7920: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
7930: 2a 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72  *.** It is an er
7940: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
7950: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 61 6e 79   function if any
7960: 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
7970: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
7980: 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f 42 41 4c  LITE_OMIT_GLOBAL
7990: 52 45 43 4f 56 45 52 0a 69 6e 74 20 73 71 6c 69  RECOVER.int sqli
79a0: 74 65 33 70 61 67 65 72 5f 72 65 73 65 74 28 50  te3pager_reset(P
79b0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
79c0: 20 69 66 28 20 70 50 61 67 65 72 20 29 7b 0a 20   if( pPager ){. 
79d0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
79e0: 52 65 66 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a  Ref || MEMDB ){.
79f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7a00: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
7a10: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
7a20: 4d 61 73 6b 20 26 3d 20 7e 28 50 41 47 45 52 5f  Mask &= ~(PAGER_
7a30: 45 52 52 5f 4d 45 4d 29 3b 0a 20 20 20 20 70 61  ERR_MEM);.    pa
7a40: 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
7a50: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7a60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
7a70: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  dif.../*.** When
7a80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7a90: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
7aa0: 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e  er has the journ
7ab0: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64  al file open and
7ac0: 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f  .** a RESERVED o
7ad0: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
7ae0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
7af0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7b00: 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20  releases.** the 
7b10: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e  database lock an
7b20: 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41  d acquires a SHA
7b30: 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  RED lock in its 
7b40: 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72  place.  The jour
7b50: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64  nal.** file is d
7b60: 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  eleted and close
7b70: 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43  d..**.** TODO: C
7b80: 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20  onsider keeping 
7b90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7ba0: 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72   open for tempor
7bb0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
7bc0: 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76  * This might giv
7bd0: 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
7be0: 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77  improvement on w
7bf0: 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65  indows where ope
7c00: 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69  ning.** a file i
7c10: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
7c20: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
7c30: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e  tic int pager_un
7c40: 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20  writelock(Pager 
7c50: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
7c60: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
7c70: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
7c80: 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  DB );.  if( pPag
7c90: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
7ca0: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
7cb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7cc0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70  ;.  }.  sqlite3p
7cd0: 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
7ce0: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
7cf0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
7d00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
7d10: 6f 2e 78 43 6c 6f 73 65 28 26 70 50 61 67 65 72  o.xClose(&pPager
7d20: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
7d30: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
7d40: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
7d50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7d60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
7d70: 6f 2e 78 43 6c 6f 73 65 28 26 70 50 61 67 65 72  o.xClose(&pPager
7d80: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67  ->jfd);.    pPag
7d90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
7da0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
7db0: 49 6f 2e 78 44 65 6c 65 74 65 28 70 50 61 67 65  Io.xDelete(pPage
7dc0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
7dd0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50    sqliteFree( pP
7de0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
7df0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
7e00: 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  aInJournal = 0;.
7e10: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
7e20: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
7e30: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
7e40: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  ){.      pPg->in
7e50: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
7e60: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
7e70: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
7e80: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 23 69 66 64  edSync = 0;.#ifd
7e90: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
7ea0: 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
7eb0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
7ec0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
7ed0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
7ee0: 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
7ef0: 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  ache = 0;.    pP
7f00: 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
7f10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
7f20: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
7f30: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
7f40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
7f50: 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20  ->dirtyCache==0 
7f60: 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  || pPager->useJo
7f70: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a  urnal==0 );.  }.
7f80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f    rc = sqlite3Io
7f90: 2e 78 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  .xUnlock(pPager-
7fa0: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
7fb0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  );.  pPager->sta
7fc0: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
7fd0: 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69  D;.  pPager->ori
7fe0: 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  gDbSize = 0;.  p
7ff0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
8000: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
8010: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  c;.}../*.** Comp
8020: 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
8030: 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68   checksum for th
8040: 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a  e page of data..
8050: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
8060: 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
8070: 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79  m.  It is really
8080: 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
8090: 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
80a0: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e  initial value an
80b0: 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
80c0: 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e  r.  We experimen
80d0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68  ted with.** a ch
80e0: 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e  ecksum of the en
80f0: 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74  tire data, but t
8100: 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f  hat was found to
8110: 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a   be too slow..**
8120: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
8130: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
8140: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62   stored at the b
8150: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
8160: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63   and.** the chec
8170: 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61  ksum is stored a
8180: 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73  t the end.  This
8190: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   is important.  
81a0: 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  If journal.** co
81b0: 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
81c0: 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
81d0: 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
81e0: 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f   likely scenario
81f0: 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20  .** is that one 
8200: 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
8210: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
8220: 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
8230: 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c   It is.** much l
8240: 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
8250: 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
8260: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
8270: 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
8280: 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
8290: 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
82a0: 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
82b0: 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
82c0: 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
82d0: 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
82e0: 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
82f0: 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
8300: 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ruption..**.** F
8310: 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72  IX ME:  Consider
8320: 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30   adding every 20
8330: 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65  0th (or so) byte
8340: 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20   of the data to 
8350: 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e  the.** checksum.
8360: 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20    That way if a 
8370: 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e  single page span
8380: 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b  s 3 or more disk
8390: 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20   sectors and.** 
83a0: 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20  only the middle 
83b0: 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70  sector is corrup
83c0: 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c  t, we will still
83d0: 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62   have a reasonab
83e0: 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20  le.** chance of 
83f0: 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63  failing the chec
8400: 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65  ksum and thus de
8410: 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62  tecting the prob
8420: 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lem..*/.static u
8430: 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
8440: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
8450: 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73 74 20 63  no pgno, const c
8460: 68 61 72 20 2a 61 44 61 74 61 29 7b 0a 20 20 75  har *aData){.  u
8470: 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
8480: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
8490: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
84a0: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20  pageSize-200;.  
84b0: 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
84c0: 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
84d0: 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
84e0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
84f0: 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cksum;.}../*.** 
8500: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
8510: 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ge from the jour
8520: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  nal file opened 
8530: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
8540: 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79  or.** jfd.  Play
8550: 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61  back this one pa
8560: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65  ge..**.** If use
8570: 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e  Cksum==0 it mean
8580: 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64  s this journal d
8590: 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63  oes not use chec
85a0: 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d  ksums.  Checksum
85b0: 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65  s.** are not use
85c0: 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a  d in statement j
85d0: 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20  ournals because 
85e0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
85f0: 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65  ls do not.** nee
8600: 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77  d to survive pow
8610: 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a  er failures..*/.
8620: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
8630: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
8640: 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
8650: 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69  , OsFile *jfd, i
8660: 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20  nt useCksum){.  
8670: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
8680: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
8690: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
86a0: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
86b0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
86c0: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
86e0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
86f0: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
8700: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
8710: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
8720: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
8730: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
8740: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
8750: 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49 54 45   u8 aData[SQLITE
8760: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b  _MAX_PAGE_SIZE];
8770: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
8780: 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a  e for a page */.
8790: 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73  .  /* useCksum s
87a0: 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f  hould be true fo
87b0: 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  r the main journ
87c0: 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72  al and false for
87d0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
87e0: 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66  journals.  Verif
87f0: 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61  y that this is a
8800: 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20  lways the case. 
8810: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66   */.  assert( jf
8820: 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f  d == (useCksum ?
8830: 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
8840: 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a  Pager->stfd) );.
8850: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
8860: 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b  its(jfd, &pgno);
8870: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8880: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8890: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
88a0: 49 6f 2e 78 52 65 61 64 28 6a 66 64 2c 20 26 61  Io.xRead(jfd, &a
88b0: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
88c0: 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  geSize);.  if( r
88d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
88e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67  eturn rc;.  pPag
88f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
8900: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
8910: 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61  ze + 4;..  /* Sa
8920: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
8930: 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
8940: 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
8950: 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
8960: 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
8970: 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
8980: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
8990: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
89a0: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
89b0: 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
89c0: 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
89d0: 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
89e0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
89f0: 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
8a00: 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
8a10: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
8a20: 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
8a30: 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
8a40: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
8a50: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
8a60: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
8a70: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
8a80: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
8a90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
8aa0: 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
8ab0: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
8ac0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8ad0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43  ;.  }.  if( useC
8ae0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  ksum ){.    rc =
8af0: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
8b00: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
8b10: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
8b20: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
8b30: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
8b40: 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73     if( pager_cks
8b50: 75 6d 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  um(pPager, pgno,
8b60: 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
8b70: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8b80: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
8b90: 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
8ba0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
8bb0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
8bc0: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
8bd0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
8be0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
8bf0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
8c00: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
8c10: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
8c20: 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
8c30: 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
8c40: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
8c50: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
8c60: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
8c70: 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
8c80: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8c90: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
8ca0: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
8cb0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
8cc0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
8cd0: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
8ce0: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
8cf0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
8d00: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
8d10: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
8d20: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
8d30: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
8d40: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
8d50: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
8d60: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
8d70: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
8d80: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
8d90: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
8da0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
8db0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
8dc0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
8dd0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
8de0: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
8df0: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
8e00: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
8e10: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
8e20: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
8e30: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
8e40: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
8e50: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
8e60: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
8e70: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
8e80: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
8e90: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
8ea0: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
8eb0: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
8ec0: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
8ed0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
8ee0: 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20 74 68  ntents are in th
8ef0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
8f00: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
8f10: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 20 66  therwise, if a f
8f20: 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63  ull ROLLBACK occ
8f30: 75 72 73 20 61 66 74 65 72 20 74 68 65 20 73 74  urs after the st
8f40: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  atement.  ** rol
8f50: 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c 20 52  lback the full R
8f60: 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e 6f 74  OLLBACK will not
8f70: 20 72 65 73 74 6f 72 65 20 74 68 65 20 70 61 67   restore the pag
8f80: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
8f90: 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20  l.  ** content. 
8fa0: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
8fb0: 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65 66 6f  must be met befo
8fc0: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
8fd0: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
8fe0: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
8ff0: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
9000: 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
9010: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
9020: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65  iginal.  ** page
9030: 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e 20 74   content is in t
9040: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
9050: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
9060: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
9070: 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f 72 20  n.  ** cache or 
9080: 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72 6b 65  else it is marke
9090: 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
90a0: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
90b0: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
90c0: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73  er, pgno);.  ass
90d0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
90e0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
90f0: 49 56 45 20 7c 7c 20 70 50 67 21 3d 30 20 29 3b  IVE || pPg!=0 );
9100: 0a 20 20 54 52 41 43 45 33 28 22 50 4c 41 59 42  .  TRACE3("PLAYB
9110: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ACK %d page %d\n
9120: 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
9130: 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  r), pgno);.  if(
9140: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
9150: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
9160: 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50  && (pPg==0 || pP
9170: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20  g->needSync==0) 
9180: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
9190: 74 65 33 49 6f 2e 78 53 65 65 6b 28 70 50 61 67  te3Io.xSeek(pPag
91a0: 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
91b0: 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
91c0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
91d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
91e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
91f0: 69 74 65 33 49 6f 2e 78 57 72 69 74 65 28 70 50  ite3Io.xWrite(pP
9200: 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c  ager->fd, aData,
9210: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9220: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
9230: 28 20 70 50 67 20 29 20 70 50 67 2d 3e 64 69 72  ( pPg ) pPg->dir
9240: 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ty = 0;.  }.  if
9250: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
9260: 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
9270: 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
9280: 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
9290: 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
92a0: 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
92b0: 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
92c0: 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
92d0: 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
92e0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
92f0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
9300: 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
9310: 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
9320: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
9330: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
9340: 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
9350: 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
9360: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
9370: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
9380: 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
9390: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
93a0: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
93b0: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67    /* assert( pPg
93c0: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67  ->nRef==0 || pPg
93d0: 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a  ->pgno==1 ); */.
93e0: 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44      pData = PGHD
93f0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
9400: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
9410: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
9420: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9430: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
9440: 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a  tructor ){  /***
9450: 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64   FIX ME:  Should
9460: 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74   this be xReinit
9470: 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61  ? ***/.      pPa
9480: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
9490: 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  (pData, pPager->
94a0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
94b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
94c0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
94d0: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
94e0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
94f0: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 43  g);.#endif.    C
9500: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
9510: 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
9520: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
9530: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
9540: 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
9550: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
9560: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9570: 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
9580: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
9590: 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
95a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
95b0: 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
95c0: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
95d0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
95e0: 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
95f0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
9600: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
9610: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
9620: 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
9630: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  it is..**.** The
9640: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9650: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  file contains th
9660: 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63  e names of all c
9670: 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a  hild journals..*
9680: 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d  * To tell if a m
9690: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61  aster journal ca
96a0: 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68  n be deleted, ch
96b0: 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74  eck to each of t
96c0: 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20  he.** children. 
96d0: 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   If all children
96e0: 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73 73   are either miss
96f0: 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65  ing or do not re
9700: 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66  fer to.** a diff
9710: 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75  erent master jou
9720: 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  rnal, then this 
9730: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
9740: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a  an be deleted..*
9750: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
9760: 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e  er_delmaster(con
9770: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
9780: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
9790: 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  nt master_open =
97a0: 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 2a 6d 61   0;.  OsFile *ma
97b0: 73 74 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  ster = 0;.  char
97c0: 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
97d0: 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
97e0: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
97f0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
9800: 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  4 nMasterJournal
9810: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
9820: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
9830: 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
9840: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
9850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63  journal file exc
9860: 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65  lusively in case
9870: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
9880: 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e  ess.  ** is runn
9890: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
98a0: 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20   also. Not that 
98b0: 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63  it makes too muc
98c0: 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20  h difference..  
98d0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
98e0: 33 49 6f 2e 78 4f 70 65 6e 52 65 61 64 4f 6e 6c  3Io.xOpenReadOnl
98f0: 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  y(zMaster, &mast
9900: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
9910: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
9920: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
9930: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31   master_open = 1
9940: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
9950: 49 6f 2e 78 46 69 6c 65 53 69 7a 65 28 6d 61 73  Io.xFileSize(mas
9960: 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
9970: 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
9980: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
9990: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
99a0: 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a  ..  if( nMasterJ
99b0: 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20  ournal>0 ){.    
99c0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a  char *zJournal;.
99d0: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
99e0: 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  rPtr = 0;..    /
99f0: 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
9a00: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9a10: 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
9a20: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
9a30: 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c     ** sqliteMall
9a40: 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
9a50: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
9a60: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20  urnal. .    */. 
9a70: 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61     zMasterJourna
9a80: 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  l = (char *)sqli
9a90: 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  teMalloc(nMaster
9aa0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66  Journal);.    if
9ab0: 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
9ac0: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
9ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9ae0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
9af0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  er_out;.    }.  
9b00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f    rc = sqlite3Io
9b10: 2e 78 52 65 61 64 28 6d 61 73 74 65 72 2c 20 7a  .xRead(master, z
9b20: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e  MasterJournal, n
9b30: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
9b40: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9b50: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
9b60: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20  master_out;..   
9b70: 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
9b80: 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  terJournal;.    
9b90: 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
9ba0: 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
9bb0: 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
9bc0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9bd0: 69 74 65 33 49 6f 2e 78 46 69 6c 65 45 78 69 73  ite3Io.xFileExis
9be0: 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a  ts(zJournal) ){.
9bf0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
9c00: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
9c10: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
9c20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9c30: 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20  exists..        
9c40: 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
9c50: 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
9c60: 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
9c70: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
9c80: 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
9c90: 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
9ca0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
9cb0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
9cc0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f      */.        O
9cd0: 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d  sFile *journal =
9ce0: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
9cf0: 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  c;..        rc =
9d00: 20 73 71 6c 69 74 65 33 49 6f 2e 78 4f 70 65 6e   sqlite3Io.xOpen
9d10: 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61  ReadOnly(zJourna
9d20: 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  l, &journal);.  
9d30: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
9d40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9d50: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
9d60: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
9d70: 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
9d80: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
9d90: 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61  al(journal, &zMa
9da0: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
9db0: 20 20 73 71 6c 69 74 65 33 49 6f 2e 78 43 6c 6f    sqlite3Io.xClo
9dc0: 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(&journal);.  
9dd0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
9de0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9df0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
9e00: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
9e10: 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
9e20: 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26 26  zMasterPtr!=0 &&
9e30: 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
9e40: 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
9e50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
9e60: 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b  ree(zMasterPtr);
9e70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29  .        if( c )
9e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
9e90: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
9ea0: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
9eb0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9ec0: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
9ed0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
9ee0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
9ef0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9f00: 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72  zJournal += (str
9f10: 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  len(zJournal)+1)
9f20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
9f30: 20 73 71 6c 69 74 65 33 49 6f 2e 78 44 65 6c 65   sqlite3Io.xDele
9f40: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65  te(zMaster);..de
9f50: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
9f60: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
9f70: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  l ){.    sqliteF
9f80: 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
9f90: 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
9fa0: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a   master_open ){.
9fb0: 20 20 20 20 73 71 6c 69 74 65 33 49 6f 2e 78 43      sqlite3Io.xC
9fc0: 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20  lose(&master);. 
9fd0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
9fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76  }../*.** Make ev
9ff0: 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20  ery page in the 
a000: 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68  cache agree with
a010: 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
a020: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
a030: 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65  s,.** reread the
a040: 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74   disk to reset t
a050: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
a060: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
a070: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a080: 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  led after a roll
a090: 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f  back in which so
a0a0: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20  me of the dirty 
a0b0: 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68  cache.** pages h
a0c0: 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ad never been wr
a0d0: 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73  itten out to dis
a0e0: 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  k.  We need to r
a0f0: 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  oll back the.** 
a100: 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e  cache content an
a110: 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61  d the easiest wa
a120: 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20  y to do that is 
a130: 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c  to reread the ol
a140: 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63  d content.** bac
a150: 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e  k from the disk.
a160: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
a170: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
a180: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
a190: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
a1a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a1b0: 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d  E_OK;.  for(pPg=
a1c0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
a1d0: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
a1e0: 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20  tAll){.    char 
a1f0: 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58 5f  zBuf[SQLITE_MAX_
a200: 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20  PAGE_SIZE];.    
a210: 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20  if( !pPg->dirty 
a220: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a230: 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
a240: 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
a250: 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
a260: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f    rc = sqlite3Io
a270: 2e 78 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  .xSeek(pPager->f
a280: 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  d, pPager->pageS
a290: 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d 3e 70  ize*(i64)(pPg->p
a2a0: 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 69  gno-1));.      i
a2b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
a2d0: 20 73 71 6c 69 74 65 33 49 6f 2e 78 52 65 61 64   sqlite3Io.xRead
a2e0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
a2f0: 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
a300: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
a310: 20 20 20 20 54 52 41 43 45 33 28 22 52 45 46 45      TRACE3("REFE
a320: 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e  TCH %d page %d\n
a330: 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
a340: 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
a350: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
a360: 72 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45  reak;.      CODE
a370: 43 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20  C(pPager, zBuf, 
a380: 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20  pPg->pgno, 2);. 
a390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a3a0: 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
a3b0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a3c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
a3d0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
a3e0: 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47   memcmp(zBuf, PG
a3f0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a400: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a410: 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ze) ){.      mem
a420: 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
a430: 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50  A(pPg), zBuf, pP
a440: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a450: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
a460: 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
a470: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
a480: 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f  xReiniter(PGHDR_
a490: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
a4a0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a4b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a4c0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
a4d0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
a4e0: 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
a4f0: 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
a500: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a510: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
a520: 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  0;.    pPg->dirt
a530: 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
a540: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
a550: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
a560: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
a570: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
a580: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
a5a0: 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  ate the main fil
a5b0: 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70  e of the given p
a5c0: 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62  ager to the numb
a5d0: 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69  er of pages.** i
a5e0: 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  ndicated..*/.sta
a5f0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
a600: 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
a610: 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29  ager, int nPage)
a620: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
a630: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
a640: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
a650: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6f  return sqlite3Io
a660: 2e 78 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  .xTruncate(pPage
a670: 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70  r->fd, pPager->p
a680: 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61  ageSize*(i64)nPa
a690: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  ge);.}../*.** Pl
a6a0: 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
a6b0: 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
a6c0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
a6d0: 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
a6e0: 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
a6f0: 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
a700: 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
a710: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
a720: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
a730: 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
a740: 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
a750: 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
a760: 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
a770: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
a780: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
a790: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
a7a0: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
a7b0: 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
a7c0: 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
a7d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
a7e0: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
a7f0: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
a800: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
a810: 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
a820: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
a830: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
a840: 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
a850: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
a860: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
a870: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
a880: 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
a890: 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
a8a0: 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
a8b0: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
a8c0: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
a8d0: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
a8e0: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
a8f0: 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
a900: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
a910: 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
a920: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
a930: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
a940: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
a950: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
a960: 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
a970: 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
a980: 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
a990: 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
a9a0: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
a9b0: 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29  ournal.).**  (6)
a9c0: 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
a9d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a9e0: 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
a9f0: 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
aa00: 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
aa10: 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
aa20: 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
aa30: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
aa40: 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
aa50: 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
aa60: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
aa70: 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
aa80: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
aa90: 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
aaa0: 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
aab0: 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
aac0: 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37  in UTF-8..**  (7
aad0: 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
aae0: 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
aaf0: 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
ab00: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
ab10: 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
ab20: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
ab30: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
ab40: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
ab50: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
ab60: 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
ab70: 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
ab80: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
ab90: 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
aba0: 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65 6d  the first 6 item
abb0: 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
abc0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
abd0: 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
abe0: 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68 20  ance of the 7th 
abf0: 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
ac00: 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
ac10: 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
ac20: 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
ac30: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
ac40: 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
ac50: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
ac60: 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
ac70: 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
ac80: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
ac90: 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
aca0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
acb0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
acc0: 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
acd0: 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
ace0: 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
acf0: 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
ad00: 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
ad10: 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
ad20: 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
ad30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ad40: 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
ad50: 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
ad60: 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
ad70: 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
ad80: 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
ad90: 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
ada0: 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
adb0: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
adc0: 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
add0: 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
ade0: 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
adf0: 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
ae00: 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
ae10: 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
ae20: 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
ae30: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
ae40: 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
ae50: 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
ae60: 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
ae70: 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
ae80: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
ae90: 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
aea0: 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
aeb0: 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
aec0: 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
aed0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
aee0: 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
aef0: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
af00: 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
af10: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
af20: 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
af30: 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
af40: 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
af50: 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
af60: 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
af70: 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
af80: 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
af90: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
afa0: 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
afb0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
afc0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
afd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
afe0: 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
aff0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
b000: 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
b010: 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
b020: 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
b030: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
b040: 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
b050: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
b060: 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
b070: 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
b080: 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
b090: 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
b0a0: 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
b0b0: 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
b0c0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
b0d0: 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
b0e0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
b0f0: 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
b100: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
b110: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
b120: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
b130: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
b140: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
b150: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a  Pager){.  i64 sz
b160: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
b170: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
b180: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
b190: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
b1a0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
b1b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b1c0: 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
b1d0: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  e journal */.  i
b1e0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
b1f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
b200: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
b210: 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
b220: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
b230: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
b240: 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
b250: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
b260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
b270: 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
b280: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68  broutine */.  ch
b290: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
b2a0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
b2b0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
b2c0: 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
b2d0: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
b2e0: 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
b2f0: 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
b300: 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
b310: 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
b320: 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
b330: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
b340: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b350: 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
b360: 6c 69 74 65 33 49 6f 2e 78 46 69 6c 65 53 69 7a  lite3Io.xFileSiz
b370: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
b380: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
b390: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b3a0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
b3b0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
b3c0: 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
b3d0: 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
b3e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
b3f0: 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
b400: 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
b410: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
b420: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
b430: 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
b440: 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
b450: 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
b460: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
b470: 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
b480: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
b490: 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
b4a0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
b4b0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
b4c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73  ager->jfd, &zMas
b4d0: 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ter);.  assert( 
b4e0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
b4f0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
b500: 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74  ITE_OK || (zMast
b510: 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 49 6f  er && !sqlite3Io
b520: 2e 78 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61  .xFileExists(zMa
b530: 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71  ster)) ){.    sq
b540: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
b550: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
b560: 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   0;.    if( rc==
b570: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63  SQLITE_DONE ) rc
b580: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b590: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
b5a0: 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ack;.  }.  sqlit
b5b0: 65 33 49 6f 2e 78 53 65 65 6b 28 70 50 61 67 65  e3Io.xSeek(pPage
b5c0: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50  r->jfd, 0);.  pP
b5d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
b5e0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
b5f0: 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
b600: 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65   either when the
b610: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
b620: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20  ) call returns. 
b630: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20   ** SQLITE_DONE 
b640: 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  or an IO error o
b650: 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c  ccurs. */.  whil
b660: 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e( 1 ){..    /* 
b670: 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
b680: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
b690: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
b6a0: 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
b6b0: 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
b6c0: 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
b6d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
b6e0: 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
b6f0: 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
b700: 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
b710: 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
b720: 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
b730: 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
b740: 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
b750: 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
b760: 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
b770: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
b780: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
b790: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
b7a0: 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52  pPager, szJ, &nR
b7b0: 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
b7c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b7d0: 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
b7e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
b7f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
b800: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
b810: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
b820: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
b830: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
b840: 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
b850: 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
b860: 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
b870: 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
b880: 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
b890: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
b8a0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
b8b0: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
b8c0: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
b8d0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
b8e0: 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
b8f0: 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
b900: 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
b910: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
b920: 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
b930: 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
b940: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b950: 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
b960: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
b970: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
b980: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
b990: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
b9a0: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
b9b0: 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
b9c0: 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
b9d0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
b9e0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
b9f0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
ba00: 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
ba10: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
ba20: 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
ba30: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
ba40: 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
ba50: 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  's original size
ba60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ba70: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
ba80: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
ba90: 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
baa0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
bab0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
bac0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
bad0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
bae0: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c  origDbSize==0 ||
baf0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
bb00: 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20  ize==mxPg );.   
bb10: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
bb20: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
bb30: 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
bb40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
bb50: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
bb60: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
bb70: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
bb80: 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
bb90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72  .    }..    /* r
bba0: 63 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 53  c = sqlite3Io.xS
bbb0: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
bbc0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
bbd0: 70 50 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20  pPager)); */.   
bbe0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bbf0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  OK ) goto end_pl
bc00: 61 79 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f  ayback;.  .    /
bc10: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
bc20: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
bc30: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
bc40: 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
bc50: 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
bc60: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
bc70: 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
bc80: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
bc90: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
bca0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
bcb0: 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  fd, 1);.      if
bcc0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bcd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
bce0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
bcf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
bd00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
bd10: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
bd20: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
bd30: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bd40: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
bd50: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
bd60: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
bd70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
bd80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
bd90: 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62  ages that have b
bda0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
bdb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e  he journal but n
bdc0: 65 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ever synced.  **
bdd0: 20 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f   where not resto
bde0: 72 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20  red by the loop 
bdf0: 61 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20  above.  We have 
be00: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65  to restore those
be10: 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72  .  ** pages by r
be20: 65 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b  eading them back
be30: 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
be40: 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  al database..  *
be50: 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  /.  assert( rc==
be60: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70  SQLITE_OK );.  p
be70: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
be80: 65 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f  e(pPager);..end_
be90: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
bea0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
beb0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
bec0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
bed0: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  er);.  }.  if( z
bee0: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a  Master ){.    /*
bef0: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
bf00: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
bf10: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
bf20: 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65  will return true
bf30: 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
bf40: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
bf50: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
bf60: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
bf70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
bf80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bf90: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
bfa0: 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29  lmaster(zMaster)
bfb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
bfc0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
bfd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
bfe0: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
bff0: 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
c000: 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
c010: 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
c020: 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
c030: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
c040: 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
c050: 66 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43  ferent PAGER_SEC
c060: 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61  TOR_SIZE.  ** va
c070: 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
c080: 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
c090: 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
c0a0: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ess..  */.  pPag
c0b0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
c0c0: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
c0d0: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ZE;.  return rc;
c0e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
c0f0: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
c100: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
c110: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
c120: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
c130: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
c140: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
c150: 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
c160: 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
c170: 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
c180: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
c190: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
c1a0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
c1b0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
c1c0: 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
c1d0: 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
c1e0: 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
c1f0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
c200: 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
c210: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
c220: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
c230: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
c240: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
c250: 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
c260: 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
c270: 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
c280: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
c290: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
c2a0: 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
c2b0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
c2c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c2d0: 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
c2e0: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
c2f0: 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c310: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
c320: 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
c330: 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69   i64 hdrOff;.  i
c340: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
c350: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c360: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
c370: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
c380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
c390: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
c3a0: 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d  int rc;..  szJ =
c3b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c3c0: 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  Off;.#ifndef NDE
c3d0: 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34  BUG .  {.    i64
c3e0: 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20   os_szJ;.    rc 
c3f0: 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 46 69 6c  = sqlite3Io.xFil
c400: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
c410: 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20  d, &os_szJ);.   
c420: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c430: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
c440: 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d      assert( szJ=
c450: 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23  =os_szJ );.  }.#
c460: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
c470: 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65  hdrOff to be the
c480: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 66   offset to the f
c490: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
c4a0: 64 65 72 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  der written.  **
c4b0: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
c4c0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
c4d0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
c4e0: 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61  ile if no journa
c4f0: 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61  l.  ** header wa
c500: 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a  s written..  */.
c510: 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65    hdrOff = pPage
c520: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20  r->stmtHdrOff;. 
c530: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
c540: 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64  >fullSync || !hd
c550: 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68  rOff );.  if( !h
c560: 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72  drOff ){.    hdr
c570: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20  Off = szJ;.  }. 
c580: 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20   .  /* Truncate 
c590: 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63  the database bac
c5a0: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
c5b0: 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69  l size..  */.  i
c5c0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
c5d0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
c5e0: 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  E ){.    rc = pa
c5f0: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
c600: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d  ger, pPager->stm
c610: 74 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50  tSize);.  }.  pP
c620: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
c630: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b  Pager->stmtSize;
c640: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
c650: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
c660: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ds are in the st
c670: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
c680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
c690: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
c6a0: 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
c6b0: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71  rnalOpen );.  sq
c6c0: 6c 69 74 65 33 49 6f 2e 78 53 65 65 6b 28 70 50  lite3Io.xSeek(pP
c6d0: 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
c6e0: 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d    nRec = pPager-
c6f0: 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20  >stmtNRec;.  .  
c700: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
c710: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
c720: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
c730: 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
c740: 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
c750: 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20  ase file.  Note 
c760: 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
c770: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73  nt journal omits
c780: 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a   checksums from.
c790: 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64    ** each record
c7a0: 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69   since power-fai
c7b0: 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73  lure recovery is
c7c0: 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74   not important t
c7d0: 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  o statement.  **
c7e0: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a   journals..  */.
c7f0: 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20    for(i=nRec-1; 
c800: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
c810: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
c820: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
c830: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66  ger, pPager->stf
c840: 64 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  d, 0);.    asser
c850: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
c860: 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
c870: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
c880: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
c890: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
c8a0: 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61  Now roll some pa
c8b0: 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  ges back from th
c8c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
c8d0: 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d  urnal. Pager.stm
c8e0: 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20  tJSize.  ** was 
c8f0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
c900: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
c910: 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
c920: 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f   was started, so
c930: 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67  .  ** everything
c940: 20 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64   after that need
c950: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
c960: 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f  ack, either into
c970: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
c980: 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  se, the memory c
c990: 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20  ache, or both.. 
c9a0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69   **.  ** If it i
c9b0: 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
c9c0: 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66   Pager.stmtHdrOf
c9d0: 66 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20  f is the offset 
c9e0: 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  to the start.  *
c9f0: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a  * of the first j
ca00: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72  ournal header wr
ca10: 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69  itten during thi
ca20: 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  s statement tran
ca30: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
ca40: 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78  rc = sqlite3Io.x
ca50: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
ca60: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  , pPager->stmtJS
ca70: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
ca80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ca90: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
caa0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
cab0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cac0: 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
cad0: 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  JSize;.  pPager-
cae0: 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61  >cksumInit = pPa
caf0: 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a  ger->stmtCksum;.
cb00: 20 20 61 73 73 65 72 74 28 20 4a 4f 55 52 4e 41    assert( JOURNA
cb10: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
cb20: 3c 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  <(pPager->pageSi
cb30: 7a 65 2b 38 29 20 29 3b 0a 20 20 77 68 69 6c 65  ze+8) );.  while
cb40: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
cb50: 6c 4f 66 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d  lOff <= (hdrOff-
cb60: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
cb70: 65 2b 38 29 29 20 29 7b 0a 20 20 20 20 72 63 20  e+8)) ){.    rc 
cb80: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
cb90: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
cba0: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31  , pPager->jfd, 1
cbb0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
cbc0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
cbd0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
cbe0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
cbf0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
cc00: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
cc10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cc20: 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20  ff < szJ ){.    
cc30: 75 33 32 20 6e 52 65 63 3b 0a 20 20 20 20 75 33  u32 nRec;.    u3
cc40: 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
cc50: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
cc60: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
cc70: 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
cc80: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
cc90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
cca0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
ccb0: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f  DONE );.      go
ccc0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
ccd0: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  back;.    }.    
cce0: 69 66 28 20 6e 52 65 63 3d 3d 30 20 29 7b 0a 20  if( nRec==0 ){. 
ccf0: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
cd00: 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
cd10: 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72  alOff) / (pPager
cd20: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20  ->pageSize+8);. 
cd30: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e     }.    for(i=n
cd40: 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70  Rec-1; i>=0 && p
cd50: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cd60: 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20  f < szJ; i--){. 
cd70: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
cd80: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
cd90: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
cda0: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20  ->jfd, 1);.     
cdb0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
cdc0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
cdd0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
cde0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
cdf0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
ce00: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
ce10: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
ce20: 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74  szJ;.  .end_stmt
ce30: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
ce40: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ce50: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
ce60: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
ce70: 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  RR_CORRUPT;.    
ce80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
ce90: 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  UPT;.  }else{.  
cea0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
ceb0: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
cec0: 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f  /* pager_reload_
ced0: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a  cache(pPager); *
cee0: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  /.  }.  return r
cef0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
cf00: 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
cf10: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
cf20: 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
cf30: 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
cf40: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
cf50: 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61  set_cachesize(Pa
cf60: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
cf70: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
cf80: 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
cf90: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
cfa0: 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73  = mxPage;.  }els
cfb0: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  e{.    pPager->m
cfc0: 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a  xPage = 10;.  }.
cfd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
cfe0: 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
cff0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
d000: 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
d010: 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
d020: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
d030: 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
d040: 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
d050: 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
d060: 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
d070: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
d080: 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
d090: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
d0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 2e 78       sqlite3Io.x
d0b0: 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
d0c0: 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
d0d0: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
d0f0: 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
d100: 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
d110: 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
d120: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
d130: 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
d140: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
d150: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
d160: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
d170: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
d180: 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
d190: 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
d1b0: 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
d1c0: 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
d1d0: 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
d1e0: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
d1f0: 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
d200: 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
d210: 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
d220: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
d230: 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
d240: 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
d250: 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
d260: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
d270: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
d280: 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
d290: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
d2a0: 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
d2b0: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
d2c0: 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
d2d0: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
d2e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d2f0: 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
d300: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
d310: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
d320: 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
d340: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
d350: 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
d360: 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
d370: 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
d380: 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
d390: 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
d3a0: 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
d3b0: 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
d3c0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
d3d0: 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
d3e0: 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
d3f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d400: 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
d410: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
d420: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
d430: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
d440: 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
d450: 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
d460: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
d470: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
d480: 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
d490: 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
d4a0: 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
d4b0: 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
d4c0: 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
d4d0: 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e   FULL=3..*/.#ifn
d4e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d4f0: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f  PAGER_PRAGMAS.vo
d500: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
d510: 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c  set_safety_level
d520: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
d530: 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50  int level){.  pP
d540: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
d550: 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
d560: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
d570: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
d580: 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21   = level==3 && !
d590: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
d5a0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
d5b0: 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
d5c0: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
d5d0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
d5e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
d5f0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
d600: 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
d610: 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
d620: 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
d630: 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
d640: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
d650: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
d660: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
d670: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
d680: 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  y.  .*/.int sqli
d690: 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
d6a0: 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  nt = 0;../*.** O
d6b0: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
d6c0: 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
d6d0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
d6e0: 65 20 69 6e 74 6f 20 7a 46 69 6c 65 0a 2a 2a 20  e into zFile.** 
d6f0: 28 7a 46 69 6c 65 20 6d 75 73 74 20 62 65 20 61  (zFile must be a
d700: 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54  t least SQLITE_T
d710: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74  EMPNAME_SIZE byt
d720: 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65  es long.)  Write
d730: 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
d740: 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64  criptor into *fd
d750: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
d760: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
d770: 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  r some.** other 
d780: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
d790: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   fail..**.** The
d7a0: 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
d7b0: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68  ically delete th
d7c0: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
d7d0: 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63   when it is.** c
d7e0: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
d7f0: 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65   int sqlite3page
d800: 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20  r_opentemp(char 
d810: 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a  *zFile, OsFile *
d820: 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74  *pFd){.  int cnt
d830: 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 8;.  int rc;.
d840: 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
d850: 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
d860: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
d870: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
d880: 6c 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  ly */.  do{.    
d890: 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74  cnt--;.    sqlit
d8a0: 65 33 49 6f 2e 78 54 65 6d 70 46 69 6c 65 4e 61  e3Io.xTempFileNa
d8b0: 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72  me(zFile);.    r
d8c0: 63 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 4f  c = sqlite3Io.xO
d8d0: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69  penExclusive(zFi
d8e0: 6c 65 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20 7d  le, pFd, 1);.  }
d8f0: 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20  while( cnt>0 && 
d900: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
d910: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
d920: 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  M );.  return rc
d930: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
d940: 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63  e a new page cac
d950: 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  he and put a poi
d960: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
d970: 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67   cache in *ppPag
d980: 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  er..** The file 
d990: 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65  to be cached nee
d9a0: 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68  d not exist.  Th
d9b0: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f  e file is not lo
d9c0: 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68  cked until.** th
d9d0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
d9e0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
d9f0: 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
da00: 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
da10: 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
da20: 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
da30: 67 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  g sqlite3pager_u
da40: 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  nref()..**.** If
da50: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
da60: 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
da70: 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
da80: 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
da90: 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
daa0: 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
dab0: 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69   cached.  The fi
dac0: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
dad0: 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
dae0: 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63  lly when it is c
daf0: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
db00: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
db10: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c  emory:" then all
db20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
db30: 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a  held in cache..*
db40: 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  * It is never wr
db50: 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20  itten to disk.  
db60: 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
db70: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
db80: 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  .** in-memory da
db90: 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
dba0: 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
dbb0: 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  (.  Pager **ppPa
dbc0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
dbd0: 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
dbe0: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
dbf0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
dc00: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
dc10: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
dc20: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
dc30: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
dc40: 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
dc50: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
dc60: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
dc70: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
dc80: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
dca0: 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
dcb0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b   this file */.){
dcc0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
dcd0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50  ;.  char *zFullP
dce0: 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69  athname = 0;.  i
dcf0: 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73  nt nameLen;.  Os
dd00: 46 69 6c 65 20 2a 66 64 3b 0a 20 20 69 6e 74 20  File *fd;.  int 
dd10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
dd20: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74    int i;.  int t
dd30: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
dd40: 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20  nt memDb = 0;.  
dd50: 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
dd60: 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  ;.  int useJourn
dd70: 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
dd80: 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
dd90: 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65  )==0;.  int noRe
dda0: 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
ddb0: 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
ddc0: 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72 20  OCK)!=0;.  char 
ddd0: 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
dde0: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20  PNAME_SIZE];..  
ddf0: 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20  *ppPager = 0;.  
de00: 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73  memset(&fd, 0, s
de10: 69 7a 65 6f 66 28 66 64 29 29 3b 0a 20 20 69 66  izeof(fd));.  if
de20: 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ( sqlite3_malloc
de30: 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  _failed ){.    r
de40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
de50: 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46  EM;.  }.  if( zF
de60: 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
de70: 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64  name[0] ){.#ifnd
de80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
de90: 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
dea0: 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
deb0: 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
dec0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
ded0: 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50   1;.      zFullP
dee0: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
def0: 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20  StrDup("");.    
df00: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
df10: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
df20: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
df30: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
df40: 71 6c 69 74 65 33 49 6f 2e 78 46 75 6c 6c 50 61  qlite3Io.xFullPa
df50: 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  thname(zFilename
df60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75  );.      if( zFu
df70: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
df80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
df90: 65 33 49 6f 2e 78 4f 70 65 6e 52 65 61 64 57 72  e3Io.xOpenReadWr
dfa0: 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ite(zFullPathnam
dfb0: 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c  e, &fd, &readOnl
dfc0: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
dfd0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
dfe0: 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
dff0: 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c  _opentemp(zTemp,
e000: 20 26 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65   &fd);.    zFile
e010: 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  name = zTemp;.  
e020: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
e030: 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 46 75 6c  = sqlite3Io.xFul
e040: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
e050: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
e060: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e070: 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20       tempFile = 
e080: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  1;.    }.  }.  i
e090: 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  f( !zFullPathnam
e0a0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
e0b0: 49 6f 2e 78 43 6c 6f 73 65 28 26 66 64 29 3b 0a  Io.xClose(&fd);.
e0c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e0d0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
e0e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e0f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
e100: 6f 2e 78 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  o.xClose(&fd);. 
e110: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
e120: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e130: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
e140: 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72  .  nameLen = str
e150: 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  len(zFullPathnam
e160: 65 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73  e);.  pPager = s
e170: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
e180: 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e  eof(*pPager) + n
e190: 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b  ameLen*3 + 30 );
e1a0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30  .  if( pPager==0
e1b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
e1c0: 6f 2e 78 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  o.xClose(&fd);. 
e1d0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
e1e0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e1f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e200: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54 52 41  NOMEM;.  }.  TRA
e210: 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE3("OPEN %d %s\
e220: 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
e230: 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  (fd), zFullPathn
e240: 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ame);.  pPager->
e250: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
e260: 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20  r*)&pPager[1];. 
e270: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
e280: 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
e290: 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e  Filename[nameLen
e2a0: 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
e2b0: 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
e2c0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61  r->zDirectory[na
e2d0: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63  meLen+1];.  strc
e2e0: 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
e2f0: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
e300: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70  ame);.  strcpy(p
e310: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
e320: 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  y, zFullPathname
e330: 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c  );.  for(i=nameL
e340: 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65  en; i>0 && pPage
e350: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
e360: 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a  1]!='/'; i--){}.
e370: 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67    if( i>0 ) pPag
e380: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
e390: 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70  -1] = 0;.  strcp
e3a0: 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
e3b0: 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  al, zFullPathnam
e3c0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
e3d0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
e3e0: 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65  .  strcpy(&pPage
e3f0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65  r->zJournal[name
e400: 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Len], "-journal"
e410: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
e420: 3d 20 66 64 3b 0a 20 20 70 50 61 67 65 72 2d 3e  = fd;.  pPager->
e430: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
e440: 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
e450: 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e  urnal = useJourn
e460: 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20  al && !memDb;.  
e470: 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
e480: 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20  ck = noReadlock 
e490: 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70  && readOnly;.  p
e4a0: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
e4b0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
e4c0: 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
e4d0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
e4e0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
e4f0: 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
e500: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e510: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
e520: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 70  T_PAGE_SIZE;.  p
e530: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
e540: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
e550: 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20  tmtJSize = 0;.  
e560: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
e570: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61  0;.  pPager->nMa
e580: 78 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61  xPage = 0;.  pPa
e590: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
e5a0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  0;.  pPager->sta
e5b0: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
e5c0: 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  K;.  pPager->err
e5d0: 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67  Mask = 0;.  pPag
e5e0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74  er->tempFile = t
e5f0: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
e600: 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62  r->memDb = memDb
e610: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
e620: 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b  Only = readOnly;
e630: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
e640: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
e650: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
e660: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
e670: 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  !useJournal;.  p
e680: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
e690: 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = (pPager->noSyn
e6a0: 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72  c?0:1);.  pPager
e6b0: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
e6c0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
e6d0: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
e6e0: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
e6f0: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
e700: 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  = FORCE_ALIGNMEN
e710: 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50 61  T(nExtra);.  pPa
e720: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
e730: 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  = PAGER_SECTOR_S
e740: 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  IZE;.  pPager->p
e750: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
e760: 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  .  memset(pPager
e770: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
e780: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
e790: 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  ));.  *ppPager =
e7a0: 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
e7b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e7c0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
e7d0: 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
e7e0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
e7f0: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75  ite3pager_set_bu
e800: 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20  syhandler(Pager 
e810: 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e  *pPager, BusyHan
e820: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
e830: 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70  er){.  pPager->p
e840: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42  BusyHandler = pB
e850: 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f  usyHandler;.}../
e860: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
e870: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73  tructor for this
e880: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
e890: 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75  NULL, the destru
e8a0: 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a  ctor is called.*
e8b0: 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  * when the refer
e8c0: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61  ence count on ea
e8d0: 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20  ch page reaches 
e8e0: 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72  zero.  The destr
e8f0: 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20  uctor can.** be 
e900: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
e910: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
e920: 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e  the extra segmen
e930: 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61  t appended to ea
e940: 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ch page..**.** T
e950: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
e960: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61   not called as a
e970: 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70   result sqlite3p
e980: 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a  ager_close().  .
e990: 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
e9a0: 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
e9b0: 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  y sqlite3pager_u
e9c0: 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  nref()..*/.void 
e9d0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
e9e0: 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  _destructor(Page
e9f0: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
ea00: 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69  (*xDesc)(void*,i
ea10: 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
ea20: 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44  xDestructor = xD
ea30: 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  esc;.}../*.** Se
ea40: 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  t the reinitiali
ea50: 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  zer for this pag
ea60: 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
ea70: 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  , the reinitiali
ea80: 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  zer.** is called
ea90: 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   when the conten
eaa0: 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63  t of a page in c
eab0: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
eac0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
ead0: 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72  .** value as a r
eae0: 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62  esult of a rollb
eaf0: 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61  ack.  The callba
eb00: 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d  ck gives higher-
eb10: 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e  level code.** an
eb20: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
eb30: 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52  restore the EXTR
eb40: 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72  A section to agr
eb50: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
eb60: 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74  ored.** page dat
eb70: 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  a..*/.void sqlit
eb80: 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e  e3pager_set_rein
eb90: 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
eba0: 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
ebb0: 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b  it)(void*,int)){
ebc0: 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
ebd0: 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
ebe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
ebf0: 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65 74   page size.  Ret
ec00: 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a 65  urn the new size
ec10: 2e 20 20 49 66 20 74 68 65 20 73 75 67 67 65 73  .  If the sugges
ec20: 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73 69  t new page.** si
ec30: 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72 69  ze is inappropri
ec40: 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74  ate, then an alt
ec50: 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69  ernative page si
ec60: 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a 2a  ze is selected.*
ec70: 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a  * and returned..
ec80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
ec90: 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65  ger_set_pagesize
eca0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ecb0: 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20  int pageSize){. 
ecc0: 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
ecd0: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
ece0: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
ecf0: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66  AGE_SIZE );.  if
ed00: 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
ed10: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
ed20: 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
ed30: 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ize;.  }.  retur
ed40: 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n pPager->pageSi
ed50: 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ze;.}../*.** The
ed60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
ed70: 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
ed80: 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
ed90: 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
eda0: 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
edb0: 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
edc0: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
edd0: 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
ede0: 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
edf0: 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
ee00: 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
ee10: 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
ee20: 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
ee30: 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
ee40: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
ee50: 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
ee60: 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
ee70: 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
ee80: 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
ee90: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
eea0: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
eeb0: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
eec0: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
eed0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
eee0: 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65 61  d_cnt;.void clea
eef0: 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  r_simulated_io_e
ef00: 72 72 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74 65  rror(){.  sqlite
ef10: 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d  3_io_error_hit =
ef20: 20 30 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61 62   0;.}.void disab
ef30: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
ef40: 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
ef50: 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
ef60: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
ef70: 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
ef80: 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
ef90: 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
efa0: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
efb0: 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
efc0: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
efd0: 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
efe0: 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
eff0: 23 20 64 65 66 69 6e 65 20 63 6c 65 61 72 5f 73  # define clear_s
f000: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
f010: 72 28 29 0a 23 20 64 65 66 69 6e 65 20 64 69 73  r().# define dis
f020: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
f030: 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
f040: 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
f050: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
f060: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
f070: 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
f080: 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
f090: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
f0a0: 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
f0b0: 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
f0c0: 6f 69 6e 74 73 20 74 6f 2e 20 20 4e 6f 20 65 72  oints to.  No er
f0d0: 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20  ror checking is 
f0e0: 64 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  done..*/.void sq
f0f0: 6c 69 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f  lite3pager_read_
f100: 66 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  fileheader(Pager
f110: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
f120: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f130: 70 44 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65 74  pDest){.  memset
f140: 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
f150: 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b   if( MEMDB==0 ){
f160: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 2e 78  .    sqlite3Io.x
f170: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
f180: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
f190: 49 6f 2e 78 52 65 61 64 28 70 50 61 67 65 72 2d  Io.xRead(pPager-
f1a0: 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a  >fd, pDest, N);.
f1b0: 20 20 20 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61      clear_simula
f1c0: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 3b 0a  ted_io_error();.
f1d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
f1e0: 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
f1f0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
f200: 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
f210: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
f220: 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a  * pPager. .**.**
f230: 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   If the PENDING_
f240: 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65  BYTE lies on the
f250: 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61   page directly a
f260: 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
f270: 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  the.** file, the
f280: 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  n consider this 
f290: 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65  page part of the
f2a0: 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65   file too. For e
f2b0: 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45  xample, if.** PE
f2c0: 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79  NDING_BYTE is by
f2d0: 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72  te 4096 (the fir
f2e0: 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20  st byte of page 
f2f0: 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  5) and the size 
f300: 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  of the.** file i
f310: 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20  s 4096 bytes, 5 
f320: 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
f330: 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74  ead of 4..*/.int
f340: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
f350: 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
f360: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b  Pager){.  i64 n;
f370: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f380: 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  r!=0 );.  if( pP
f390: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
f3a0: 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65  ){.    n = pPage
f3b0: 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65  r->dbSize;.  } e
f3c0: 6c 73 65 20 7b 0a 20 20 20 20 69 66 28 20 73 71  lse {.    if( sq
f3d0: 6c 69 74 65 33 49 6f 2e 78 46 69 6c 65 53 69 7a  lite3Io.xFileSiz
f3e0: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
f3f0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
f400: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
f410: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
f420: 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 20 20 72  RR_DISK;.      r
f430: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
f440: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c     if( n>0 && n<
f450: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f460: 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b   ){.      n = 1;
f470: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f480: 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70    n /= pPager->p
f490: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20  ageSize;.    }. 
f4a0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
f4b0: 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
f4c0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
f4d0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a  er->dbSize = n;.
f4e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
f4f0: 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  n==(PENDING_BYTE
f500: 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
f510: 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20  e) ){.    n++;. 
f520: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
f530: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
f540: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
f550: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
f560: 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a  urnal(Pager*);..
f570: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
f580: 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
f590: 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74   chain. Also set
f5a0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
f5b0: 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
f5c0: 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  e.** that the pa
f5d0: 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ge is not part o
f5e0: 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  f any hash chain
f5f0: 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
f600: 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ed because the.*
f610: 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d  * sqlite3pager_m
f620: 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e  ovepage() routin
f630: 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61  e can leave a pa
f640: 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e  ge in the .** pN
f650: 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65  extFree/pPrevFre
f660: 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e  e list that is n
f670: 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79  ot a part of any
f680: 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a   hash-chain..*/.
f690: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
f6a0: 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65  nkHashChain(Page
f6b0: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
f6c0: 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
f6d0: 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  g->pgno==0 ){.  
f6e0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
f6f0: 20 6e 75 6d 62 65 72 20 69 73 20 7a 65 72 6f 2c   number is zero,
f700: 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
f710: 69 73 20 6e 6f 74 20 69 6e 20 61 6e 79 20 68 61  is not in any ha
f720: 73 68 20 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 20  sh chain. */.   
f730: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
f740: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
f750: 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  h ){.    pPg->pN
f760: 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
f770: 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
f780: 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ash;.  }.  if( p
f790: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b  Pg->pPrevHash ){
f7a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
f7b0: 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72  ger->aHash[pager
f7c0: 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29  _hash(pPg->pgno)
f7d0: 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  ]!=pPg );.    pP
f7e0: 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e  g->pPrevHash->pN
f7f0: 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
f800: 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73  NextHash;.  }els
f810: 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70  e{.    int h = p
f820: 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70  ager_hash(pPg->p
f830: 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
f840: 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
f850: 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  h]==pPg );.    p
f860: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
f870: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
f880: 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 67  ;.  }..  pPg->pg
f890: 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70  no = 0;.  pPg->p
f8a0: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
f8b0: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d  pPrevHash = 0;.}
f8c0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61  ../*.** Unlink a
f8d0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
f8e0: 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69  ree list (the li
f8f0: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
f900: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a  where nRef==0).*
f910: 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68  * and from its h
f920: 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68  ash collision ch
f930: 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
f940: 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50  oid unlinkPage(P
f950: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
f960: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
f970: 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
f980: 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74   Keep the pFirst
f990: 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70  Synced pointer p
f9a0: 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66  ointing at the f
f9b0: 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65  irst synchronize
f9c0: 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20  d page */.  if( 
f9d0: 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  pPg==pPager->pFi
f9e0: 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
f9f0: 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
fa00: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
fa10: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
fa20: 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
fa30: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
fa40: 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
fa50: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d  tSynced = p;.  }
fa60: 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
fa70: 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
fa80: 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  */.  if( pPg->pP
fa90: 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70  revFree ){.    p
faa0: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
fab0: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
fac0: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c  pNextFree;.  }el
fad0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
fae0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
faf0: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
fb00: 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d  r->pFirst = pPg-
fb10: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a  >pNextFree;.  }.
fb20: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
fb30: 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
fb40: 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
fb50: 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
fb60: 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  evFree;.  }else{
fb70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
fb80: 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20  ger->pLast==pPg 
fb90: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
fba0: 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
fbb0: 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67  vFree;.  }.  pPg
fbc0: 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
fbd0: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30  g->pPrevFree = 0
fbe0: 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  ;..  /* Unlink f
fbf0: 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73  rom the pgno has
fc00: 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c  h table */.  unl
fc10: 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
fc20: 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23 69  ger, pPg);.}..#i
fc30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fc40: 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a  T_MEMORYDB./*.**
fc50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
fc60: 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
fc70: 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
fc80: 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74 65  atabase.  Delete
fc90: 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77 68  .** all pages wh
fca0: 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67  ose pgno is larg
fcb0: 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
fcc0: 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e  dbSize and is un
fcd0: 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52  referenced..** R
fce0: 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
fcf0: 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
fd00: 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a  er->dbSize are z
fd10: 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eroed..*/.static
fd20: 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e   void memoryTrun
fd30: 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
fd40: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
fd50: 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  g;.  PgHdr **ppP
fd60: 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20  g;.  int dbSize 
fd70: 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
fd80: 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61  ;..  ppPg = &pPa
fd90: 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69  ger->pAll;.  whi
fda0: 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67  le( (pPg = *ppPg
fdb0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
fdc0: 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a  pPg->pgno<=dbSiz
fdd0: 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20  e ){.      ppPg 
fde0: 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
fdf0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
fe00: 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20  pPg->nRef>0 ){. 
fe10: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
fe20: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
fe30: 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
fe40: 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67  ize);.      ppPg
fe50: 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
fe60: 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
fe70: 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d      *ppPg = pPg-
fe80: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
fe90: 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
fea0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
feb0: 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  ee(pPg);.      p
fec0: 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a  Pager->nPage--;.
fed0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
fee0: 65 0a 23 64 65 66 69 6e 65 20 6d 65 6d 6f 72 79  e.#define memory
fef0: 54 72 75 6e 63 61 74 65 28 70 29 0a 23 65 6e 64  Truncate(p).#end
ff00: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  if../*.** Try to
ff10: 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
ff20: 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b  n a file.  Invok
ff30: 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
ff40: 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a  ack if the lock.
ff50: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
ff60: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  not available.  
ff70: 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65  Repeat until the
ff80: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
ff90: 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20  eturns.** false 
ffa0: 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63  or until the loc
ffb0: 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
ffc0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
ffd0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
ffe0: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
fff0: 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
10000 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
10010 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
10020 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
10030 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
10040 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
10050 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
10060 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
10070 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
10080 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
10090 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
100a0 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
100b0 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
100c0 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
100d0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
100e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
100f0 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
10100 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10110 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
10120 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10130 65 33 49 6f 2e 78 4c 6f 63 6b 28 70 50 61 67 65  e3Io.xLock(pPage
10140 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
10150 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
10160 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
10170 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
10180 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
10190 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20  ->pBusyHandler) 
101a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
101b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
101c0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
101d0 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
101e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
101f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
10200 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
10210 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
10220 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a  ages specified..
10230 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
10240 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
10250 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
10260 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
10270 63 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  c;.  sqlite3page
10280 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
10290 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
102a0 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
102b0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
102c0 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
102d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
102e0 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
102f0 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  =(unsigned)pPage
10300 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
10310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10320 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  K;.  }.  if( MEM
10330 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
10340 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
10350 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e  ;.    memoryTrun
10360 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20  cate(pPager);.  
10370 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10380 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OK;.  }.  rc = s
10390 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
103a0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
103b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
103c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
103d0 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75   /* Get an exclu
103e0 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
103f0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
10400 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a   truncating. */.
10410 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
10420 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
10430 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
10440 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
10460 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
10470 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
10480 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67  ate(pPager, nPag
10490 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
104a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
104b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
104c0 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nPage;.  }.  ret
104d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
104e0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
104f0 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
10500 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
10510 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
10520 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
10530 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
10540 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
10550 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
10560 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
10570 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
10580 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
10590 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
105a0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
105b0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
105c0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
105d0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
105e0 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
105f0 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
10600 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
10610 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
10620 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
10630 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
10640 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69  a coredump..*/.i
10650 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
10660 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  close(Pager *pPa
10670 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
10680 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77  Pg, *pNext;.  sw
10690 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74  itch( pPager->st
106a0 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
106b0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3a 0a  PAGER_RESERVED:.
106c0 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 53      case PAGER_S
106d0 59 4e 43 45 44 3a 20 0a 20 20 20 20 63 61 73 65  YNCED: .    case
106e0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
106f0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  : {.      /* We 
10700 69 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65 72  ignore any IO er
10710 72 6f 72 73 20 74 68 61 74 20 6f 63 63 75 72 20  rors that occur 
10720 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
10730 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65  ack.      ** ope
10740 72 61 74 69 6f 6e 2e 20 53 6f 20 64 69 73 61 62  ration. So disab
10750 6c 65 20 49 4f 20 65 72 72 6f 72 20 73 69 6d 75  le IO error simu
10760 6c 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  lation so that t
10770 65 73 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  esting.      ** 
10780 77 6f 72 6b 73 20 6d 6f 72 65 20 65 61 73 69 6c  works more easil
10790 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
107a0 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
107b0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
107c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61  .      sqlite3pa
107d0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
107e0 67 65 72 29 3b 0a 20 20 20 20 20 20 65 6e 61 62  ger);.      enab
107f0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
10800 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 20 20  errors();.      
10810 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
10820 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 2e        sqlite3Io.
10830 78 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  xUnlock(pPager->
10840 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
10850 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
10860 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  rt( pPager->errM
10870 61 73 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  ask || pPager->j
10880 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
10890 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
108a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 41 47    }.    case PAG
108b0 45 52 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20 20  ER_SHARED: {.   
108c0 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
108d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
108e0 49 6f 2e 78 55 6e 6c 6f 63 6b 28 70 50 61 67 65  Io.xUnlock(pPage
108f0 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
10900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10910 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10920 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
10930 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
10940 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
10950 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
10960 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
10970 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
10980 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
10990 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
109a0 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
109b0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
109c0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
109d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
109e0 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79  ert( !pPg->alway
109f0 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
10a00 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
10a10 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  t->pOrig );.    
10a20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
10a30 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d  ->pStmt );.    }
10a40 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 78  .#endif.    pNex
10a50 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  t = pPg->pNextAl
10a60 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  l;.    sqliteFre
10a70 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 54 52  e(pPg);.  }.  TR
10a80 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE2("CLOSE %d\n
10a90 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
10aa0 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r));.  assert( p
10ab0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
10ac0 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
10ad0 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61  alOpen==0 && pPa
10ae0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30  ger->stmtOpen==0
10af0 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
10b00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
10b10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 2e  {.    sqlite3Io.
10b20 78 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  xClose(&pPager->
10b30 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
10b40 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
10b50 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  InJournal);.  if
10b60 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
10b70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
10b80 33 49 6f 2e 78 43 6c 6f 73 65 28 26 70 50 61 67  3Io.xClose(&pPag
10b90 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20  er->stfd);.  }. 
10ba0 20 73 71 6c 69 74 65 33 49 6f 2e 78 43 6c 6f 73   sqlite3Io.xClos
10bb0 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  e(&pPager->fd);.
10bc0 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20    /* Temp files 
10bd0 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
10be0 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65  y deleted by the
10bf0 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61   OS.  ** if( pPa
10c00 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
10c10 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 49  .  **   sqlite3I
10c20 6f 2e 78 44 65 6c 65 74 65 28 70 50 61 67 65 72  o.xDelete(pPager
10c30 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
10c40 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c  ** }.  */..  sql
10c50 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b  iteFree(pPager);
10c60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10c70 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
10c80 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
10c90 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76  mber for the giv
10ca0 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  en page data..*/
10cb0 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67  .Pgno sqlite3pag
10cc0 65 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f  er_pagenumber(vo
10cd0 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
10ce0 48 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f  Hdr *p = DATA_TO
10cf0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
10d00 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
10d10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
10d20 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f  ge_ref() functio
10d30 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  n increments the
10d40 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
10d50 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20   for a page..** 
10d60 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63  If the page is c
10d70 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
10d80 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65  freelist (the re
10d90 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
10da0 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72   zero) then.** r
10db0 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
10dc0 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
10dd0 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73  * For non-test s
10de0 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
10df0 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68  () is a macro th
10e00 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72  at calls _page_r
10e10 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f  ef().** online o
10e20 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
10e30 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20  count is zero.  
10e40 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73  For test systems
10e50 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20  , page_ref().** 
10e60 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  is a real functi
10e70 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  on so that we ca
10e80 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74  n set breakpoint
10e90 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a  s and trace it..
10ea0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f  */.static void _
10eb0 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
10ec0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
10ed0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
10ee0 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63  /* The page is c
10ef0 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
10f00 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76  freelist.  Remov
10f10 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  e it. */.    if(
10f20 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65   pPg==pPg->pPage
10f30 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
10f40 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
10f50 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  p = pPg->pNextFr
10f60 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ee;.      while(
10f70 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
10f80 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  c ){ p = p->pNex
10f90 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70  tFree; }.      p
10fa0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
10fb0 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
10fc0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
10fd0 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
10fe0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
10ff0 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
11000 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
11010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11020 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
11030 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
11040 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tFree;.    }.   
11050 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
11060 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
11070 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
11080 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
11090 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  revFree;.    }el
110a0 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
110b0 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
110c0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
110d0 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
110e0 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
110f0 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b  }.  pPg->nRef++;
11100 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
11110 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
11120 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  _DEBUG.  static 
11130 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67  void page_ref(Pg
11140 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69  Hdr *pPg){.    i
11150 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
11160 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72  ){.      _page_r
11170 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  ef(pPg);.    }el
11180 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  se{.      pPg->n
11190 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46  Ref++;.      REF
111a0 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d  INFO(pPg);.    }
111b0 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
111c0 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
111d0 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
111e0 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
111f0 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
11200 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
11210 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
11220 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
11230 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
11240 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
11250 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
11260 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
11270 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
11280 65 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61  er_ref(void *pDa
11290 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
112a0 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
112b0 52 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65  R(pData);.  page
112c0 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74  _ref(pPg);.  ret
112d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
112e0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
112f0 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
11300 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
11310 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
11320 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
11330 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
11340 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
11350 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
11360 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
11370 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
11380 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
11390 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
113a0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
113b0 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
113c0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
113d0 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
113e0 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
113f0 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
11400 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
11410 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
11420 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
11430 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
11440 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
11450 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
11460 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
11470 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
11480 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
11490 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
114a0 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
114b0 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
114c0 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
114d0 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
114e0 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
114f0 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
11500 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
11510 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
11520 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
11530 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
11540 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
11550 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
11560 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
11570 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
11580 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
11590 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
115a0 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
115b0 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
115c0 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
115d0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
115e0 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
115f0 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
11600 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
11610 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
11620 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
11630 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
11640 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
11650 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
11660 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63  failure, so sync
11670 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
11680 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
11690 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  rs the needSync 
116a0 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70  field of every p
116b0 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64  age current held
116c0 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a   in.** memory..*
116d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
116e0 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
116f0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
11700 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
11710 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
11720 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
11730 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  nal before modif
11740 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61  ying the main da
11750 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73  tabase.  ** (ass
11760 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61  uming there is a
11770 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20   journal and it 
11780 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
11790 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ed.).  */.  if( 
117a0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
117b0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
117c0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
117d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
117e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
117f0 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61  en );.      /* a
11800 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
11810 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53  noSync ); // noS
11820 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65 74  ync might be set
11830 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a   if synchronous.
11840 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72        ** was tur
11850 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20 74 68  ned off after th
11860 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
11870 73 20 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b  s started.  Tick
11880 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64  et #615 */.#ifnd
11890 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20  ef NDEBUG.      
118a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  {.        /* Mak
118b0 65 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65  e sure the pPage
118c0 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20  r->nRec counter 
118d0 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61  we are keeping a
118e0 67 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  grees.        **
118f0 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63   with the nRec c
11900 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
11910 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
11920 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
11930 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
11940 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72  4 jSz;.        r
11950 63 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 46  c = sqlite3Io.xF
11960 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
11970 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20  jfd, &jSz);.    
11980 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
11990 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
119a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
119b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a  r->journalOff==j
119c0 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Sz );.      }.#e
119d0 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20  ndif.      {.   
119e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
119f0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
11a00 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
11a10 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
11a20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
11a30 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
11a40 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
11a50 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
11a60 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
11a70 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
11a80 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
11a90 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
11aa0 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
11ab0 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
11ac0 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
11ad0 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
11ae0 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  k. .        */. 
11af0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
11b00 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
11b10 20 20 20 20 20 20 20 20 20 54 52 41 43 45 32 28           TRACE2(
11b20 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
11b30 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
11b40 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
11b50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11b60 49 6f 2e 78 53 79 6e 63 28 70 50 61 67 65 72 2d  Io.xSync(pPager-
11b70 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
11b80 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
11b90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
11ba0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
11bb0 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 53 65 65  = sqlite3Io.xSee
11bc0 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20  k(pPager->jfd,. 
11bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11be0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
11bf0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
11c00 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
11c10 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69  gic));.        i
11c20 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
11c30 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  c;.        rc = 
11c40 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
11c50 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11c60 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
11c70 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
11c80 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20  rc;..        rc 
11c90 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 53 65 65  = sqlite3Io.xSee
11ca0 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
11cb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11cc0 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
11cd0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
11ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
11cf0 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
11d00 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
11d10 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
11d20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11d30 33 49 6f 2e 78 53 79 6e 63 28 70 50 61 67 65 72  3Io.xSync(pPager
11d40 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66  ->jfd, pPager->f
11d50 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  ullSync);.      
11d60 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
11d70 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61  rn rc;.      pPa
11d80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
11d90 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
11da0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
11db0 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
11dc0 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
11dd0 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
11de0 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
11df0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
11e00 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
11e10 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
11e20 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  l){.      pPg->n
11e30 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
11e40 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
11e50 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
11e60 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
11e70 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
11e80 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61  G.  /* If the Pa
11e90 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
11ea0 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
11eb0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
11ec0 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73  nc.  ** flag mus
11ed0 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20  t also be clear 
11ee0 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20  for all pages.  
11ef0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
11f00 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20  .  ** invariant 
11f10 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  is true..  */.  
11f20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50  else{.    for(pP
11f30 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
11f40 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
11f50 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61  extAll){.      a
11f60 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
11f70 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  Sync==0 );.    }
11f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
11f90 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
11fa0 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  d==pPager->pFirs
11fb0 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t );.  }.#endif.
11fc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11fd0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c  ./*.** Given a l
11fe0 69 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f  ist of pages (co
11ff0 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50  nnected by the P
12000 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
12010 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76  ter) write.** ev
12020 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ery one of those
12030 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68   pages out to th
12040 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12050 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c  and mark them al
12060 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a  l.** as clean..*
12070 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
12080 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
12090 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b  t(PgHdr *pList){
120a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
120b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
120c0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
120d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
120e0 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
120f0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
12100 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
12110 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
12120 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
12130 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
12140 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
12150 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
12160 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
12170 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
12180 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
12190 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
121a0 69 74 65 33 49 6f 2e 78 4c 6f 63 6b 28 29 20 61  ite3Io.xLock() a
121b0 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a  re no-ops..  **.
121c0 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
121d0 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
121e0 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
121f0 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
12200 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
12210 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
12220 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
12230 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
12240 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
12250 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
12260 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
12270 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
12280 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
12290 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
122a0 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
122b0 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
122c0 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
122d0 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
122e0 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
122f0 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
12300 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
12310 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
12320 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
12330 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
12340 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
12350 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
12360 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
12370 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
12380 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
12390 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
123a0 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
123b0 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
123c0 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
123d0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
123e0 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
123f0 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
12400 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
12410 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12420 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
12430 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
12440 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
12450 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
12460 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
12470 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
12480 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
12490 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
124a0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
124b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
124c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
124d0 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
124e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
124f0 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  t->dirty );.    
12500 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78  rc = sqlite3Io.x
12510 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
12520 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29   (pList->pgno-1)
12530 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
12540 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
12550 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
12560 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
12570 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
12580 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
12590 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
125a0 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
125b0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
125c0 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
125d0 73 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74  s sqlite3pager_t
125e0 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61  runcate() was ca
125f0 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
12600 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
12610 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
12620 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
12630 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
12640 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
12650 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
12660 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
12670 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
12680 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
12690 65 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43  e ){.      CODEC
126a0 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
126b0 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70  O_DATA(pList), p
126c0 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a  List->pgno, 6);.
126d0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54        TRACE3("ST
126e0 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
126f0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
12700 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  r), pList->pgno)
12710 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
12720 69 74 65 33 49 6f 2e 78 57 72 69 74 65 28 70 50  ite3Io.xWrite(pP
12730 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
12740 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 0a  TO_DATA(pList),.
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
12770 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
12780 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
12790 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
127a0 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d  A(pList), pList-
127b0 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20  >pgno, 0);.     
127c0 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65   TEST_INCR(pPage
127d0 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
127e0 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
127f0 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
12800 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45   TRACE3("NOSTORE
12810 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
12820 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
12830 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
12840 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
12850 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
12860 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64  rc;.    pList->d
12870 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66  irty = 0;.#ifdef
12880 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
12890 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
128a0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
128b0 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
128c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
128d0 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
128e0 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
128f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12900 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72  .** Collect ever
12910 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74  y dirty page int
12920 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61  o a dirty list a
12930 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70  nd.** return a p
12940 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
12950 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e  ad of that list.
12960 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a    All pages are.
12970 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65  ** collected eve
12980 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74  n if they are st
12990 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  ill in use..*/.s
129a0 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
129b0 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
129c0 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  _pages(Pager *pP
129d0 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
129e0 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69  p, *pList;.  pLi
129f0 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  st = 0;.  for(p=
12a00 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
12a10 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
12a20 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74  .    if( p->dirt
12a30 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44  y ){.      p->pD
12a40 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20  irty = pList;.  
12a50 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20      pList = p;. 
12a60 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12a70 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
12a80 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
12a90 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
12aa0 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67  journal on the g
12ab0 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41  iven pager..** A
12ac0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
12ad0 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  one that needs t
12ae0 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
12af0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
12b00 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
12b10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12b20 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
12b30 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
12b40 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
12b50 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
12b60 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
12b70 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
12b80 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
12b90 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74  same name.  Just
12ba0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
12bb0 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nal..*/.static i
12bc0 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
12bd0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
12be0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
12bf0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74  useJournal ) ret
12c00 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
12c10 6c 69 74 65 33 49 6f 2e 78 46 69 6c 65 45 78 69  lite3Io.xFileExi
12c20 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  sts(pPager->zJou
12c30 72 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30  rnal) ) return 0
12c40 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ;.  if( sqlite3I
12c50 6f 2e 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o.xCheckReserved
12c60 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29  Lock(pPager->fd)
12c70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
12c80 66 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  f( sqlite3pager_
12c90 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
12ca0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
12cb0 74 65 33 49 6f 2e 78 44 65 6c 65 74 65 28 70 50  te3Io.xDelete(pP
12cc0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
12cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
12ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
12cf0 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
12d00 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
12d10 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20  e..**.** A read 
12d20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b  lock on the disk
12d30 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65   file is obtaine
12d40 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  d when the first
12d50 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65   page is acquire
12d60 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64  d. .** This read
12d70 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64   lock is dropped
12d80 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70   when the last p
12d90 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e  age is released.
12da0 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f  .**.** A _get wo
12db0 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65  rks for any page
12dc0 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
12dd0 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20  than 0.  If the 
12de0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
12df0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
12e00 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
12e10 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74  age, then no act
12e20 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  ual disk.** read
12e30 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
12e40 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
12e50 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74  the page is init
12e60 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c  ialized to.** al
12e70 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78  l zeros.  The ex
12e80 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
12e90 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
12ea0 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
12eb0 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68  d.** to zeros th
12ec0 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  e first time a p
12ed0 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
12ee0 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  to memory..**.**
12ef0 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
12f00 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
12f10 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
12f20 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
12f30 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
12f40 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
12f50 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
12f60 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
12f70 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
12f80 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  lso sqlite3pager
12f90 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  _lookup().  Both
12fa0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
12fb0 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65  d _lookup() atte
12fc0 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
12fd0 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
12fe0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
12ff0 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
13000 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
13010 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
13020 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
13030 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
13040 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c  it in whereas _l
13050 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
13060 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
13070 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
13080 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
13090 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
130a0 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
130b0 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
130c0 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
130d0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
130e0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
130f0 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65  nce _lookup() ne
13100 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
13110 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
13120 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
13130 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
13140 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
13150 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 50  lite3pager_get(P
13160 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
13170 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a  no pgno, void **
13180 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72  ppPage){.  PgHdr
13190 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
131a0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
131b0 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
131c0 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
131d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
131e0 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
131f0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
13200 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
13210 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
13220 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
13230 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
13240 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
13250 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
13260 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
13270 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
13280 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
13290 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
132a0 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
132b0 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
132c0 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
132d0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
132e0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
132f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
13300 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45  Mask & ~(PAGER_E
13310 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20  RR_FULL) ){.    
13320 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
13330 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
13340 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
13350 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
13360 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e  e accessed, then
13370 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f   get a SHARED lo
13380 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
13390 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
133a0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
133b0 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d  >nRef==0 && !MEM
133c0 44 42 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  DB ){.    if( !p
133d0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
133e0 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  k ){.      rc = 
133f0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
13400 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
13410 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
13420 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13430 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
13440 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
13450 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
13460 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
13470 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
13480 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
13490 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
134a0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
134b0 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
134c0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
134d0 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
134e0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
134f0 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  if( hasHotJourna
13500 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
13510 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
13520 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
13530 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
13540 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13550 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
13560 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 2a 2a   it is.       **
13570 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
13580 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
13590 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
135a0 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
135b0 65 0a 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  e.       ** EXCL
135c0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
135d0 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
135e0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
135f0 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a  en the.       **
13600 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
13610 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
13620 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
13630 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
13640 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
13650 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
13660 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
13670 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
13680 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20  olling it .     
13690 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20    ** back..     
136a0 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a 20    ** .       ** 
136b0 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
136c0 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
136d0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
136e0 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20  quested, the.   
136f0 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72      ** second pr
13700 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74  ocess will get t
13710 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  o this point in 
13720 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
13730 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20 6f  l to.       ** o
13740 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45  btain it's own E
13750 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
13760 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13770 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  le..       */.  
13780 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13790 33 49 6f 2e 78 4c 6f 63 6b 28 70 50 61 67 65 72  3Io.xLock(pPager
137a0 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
137b0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66  LOCK);.       if
137c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
137d0 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ){.         sqli
137e0 74 65 33 49 6f 2e 78 55 6e 6c 6f 63 6b 28 70 50  te3Io.xUnlock(pP
137f0 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
13800 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61  K);.         pPa
13810 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
13820 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  ER_UNLOCK;.     
13830 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70        }.       p
13850 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
13860 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
13870 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  .       /* Open 
13880 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
13890 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52  reading only.  R
138a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
138b0 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77  Y if.       ** w
138c0 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
138d0 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
138e0 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a   file. .       *
138f0 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  *.       ** The 
13900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
13910 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
13920 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20   locked itself. 
13930 20 54 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a   The.       ** j
13940 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
13950 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73  ever open unless
13960 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
13970 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20  se file holds.  
13980 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20       ** a write 
13990 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69  lock, so there i
139a0 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e  s never any chan
139b0 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ce of two or mor
139c0 65 0a 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  e.       ** proc
139d0 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
139e0 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
139f0 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
13a00 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
13a10 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 4f 70 65  = sqlite3Io.xOpe
13a20 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67 65 72  nReadOnly(pPager
13a30 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
13a40 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
13a50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13a60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
13a70 73 71 6c 69 74 65 33 49 6f 2e 78 55 6e 6c 6f 63  sqlite3Io.xUnloc
13a80 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
13a90 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
13aa0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
13ab0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
13ac0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
13ad0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
13ae0 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
13af0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
13b00 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67  = 1;.       pPag
13b10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
13b20 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70  ed = 0;.       p
13b30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13b40 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50  f = 0;.       pP
13b50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
13b60 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67  = 0;.       pPag
13b70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
13b80 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50   0;..       /* P
13b90 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
13ba0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
13bb0 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
13bc0 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20  se write.       
13bd0 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
13be0 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
13bf0 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ock..       */. 
13c00 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
13c10 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
13c20 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
13c30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13c40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
13c50 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  c;.       }.    
13c60 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  }.    pPg = 0;. 
13c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53   }else{.    /* S
13c80 65 61 72 63 68 20 66 6f 72 20 70 61 67 65 20 69  earch for page i
13c90 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70  n cache */.    p
13ca0 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
13cb0 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
13cc0 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 26  .    if( MEMDB &
13cd0 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  & pPager->state=
13ce0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
13cf0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
13d00 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
13d10 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RED;.    }.  }. 
13d20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
13d30 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
13d40 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
13d50 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
13d60 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b  e. */.    int h;
13d70 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70  .    TEST_INCR(p
13d80 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
13d90 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
13da0 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50  Page<pPager->mxP
13db0 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  age || pPager->p
13dc0 46 69 72 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d 44  First==0 || MEMD
13dd0 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72  B ){.      /* Cr
13de0 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
13df0 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73  */.      pPg = s
13e00 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
13e10 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70  sizeof(*pPg) + p
13e20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a  Pager->pageSize.
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
13e50 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50  sizeof(u32) + pP
13e60 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20  ager->nExtra.   
13e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e80 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d             + MEM
13e90 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74  DB*sizeof(PgHist
13ea0 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ory) );.      if
13eb0 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
13ec0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
13ed0 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
13ee0 5f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65  _MEM;.        re
13ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13f00 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
13f10 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20   memset(pPg, 0, 
13f20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20  sizeof(*pPg));. 
13f30 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
13f40 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
13f50 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
13f60 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
13f70 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
13f80 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
13f90 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
13fa0 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50  pPager;.      pP
13fb0 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  g->pNextAll = pP
13fc0 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20  ager->pAll;.    
13fd0 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
13fe0 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67   pPg;.      pPag
13ff0 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  er->nPage++;.   
14000 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
14010 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61  Page>pPager->nMa
14020 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
14030 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14040 3e 6e 4d 61 78 50 61 67 65 3d 3d 28 70 50 61 67  >nMaxPage==(pPag
14050 65 72 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a  er->nPage-1) );.
14060 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
14070 6e 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20  nMaxPage++;.    
14080 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
14090 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 70       /* Find a p
140a0 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20  age to recycle. 
140b0 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61   Try to locate a
140c0 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
140d0 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72 65 71  not.      ** req
140e0 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e  uire us to do an
140f0 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20   fsync() on the 
14100 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a  journal..      *
14110 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  /.      pPg = pP
14120 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
14130 65 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  ed;..      /* If
14140 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69   we could not fi
14150 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64  nd a page that d
14160 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
14170 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 20 20 20  an fsync().     
14180 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e   ** on the journ
14190 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79  al file then fsy
141a0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
141b0 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a  ile.  This is a.
141c0 20 20 20 20 20 20 2a 2a 20 76 65 72 79 20 73 6c        ** very sl
141d0 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f  ow operation, so
141e0 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f   we work hard to
141f0 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20   avoid it.  But 
14200 73 6f 6d 65 74 69 6d 65 73 0a 20 20 20 20 20 20  sometimes.      
14210 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68  ** it can't be h
14220 65 6c 70 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  elped..      */.
14230 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30        if( pPg==0
14240 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
14250 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
14260 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14270 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
14280 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14290 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
142a0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
142b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
142c0 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d  IOERR;.        }
142d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
142e0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
142f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
14300 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
14310 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20  de, write a new 
14320 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
14330 6e 74 6f 20 74 68 65 0a 09 20 20 2a 2a 20 6a 6f  nto the..  ** jo
14340 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
14350 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69   is done to avoi
14360 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67  d ever modifying
14370 20 61 20 6a 6f 75 72 6e 61 6c 0a 09 20 20 2a 2a   a journal..  **
14380 20 68 65 61 64 65 72 20 74 68 61 74 20 69 73 20   header that is 
14390 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
143a0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65  rollback of page
143b0 73 20 74 68 61 74 20 68 61 76 65 0a 09 20 20 2a  s that have..  *
143c0 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  * already been w
143d0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
143e0 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20  tabase (in case 
143f0 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 09 20  the header is.. 
14400 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e   ** trashed when
14410 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
14420 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20  is updated)..   
14430 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
14440 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
14450 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
14460 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14470 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29  journalOff > 0 )
14480 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
14490 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
144a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
144b0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
144c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
144d0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
144e0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
144f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14500 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
14510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14520 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d   }.        pPg =
14530 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
14540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
14550 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
14560 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ==0 );..      /*
14570 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
14580 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14590 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69  file if it is di
145a0 72 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  rty..      */.  
145b0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72      if( pPg->dir
145c0 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ty ){.        as
145d0 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
145e0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ync==0 );.      
145f0 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
14600 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
14610 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
14620 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20  list( pPg );.   
14630 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
14640 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14650 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
14660 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
14670 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
14680 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14690 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
146a0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
146b0 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
146c0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
146d0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
146e0 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72  recycling is mar
146f0 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
14700 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20  lback, then.    
14710 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f    ** set the glo
14720 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  bal alwaysRollba
14730 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69  ck flag, thus di
14740 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 20 20  sabling the.    
14750 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74    ** sqlite_dont
14760 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69  _rollback() opti
14770 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  mization for the
14780 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72   rest of this tr
14790 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
147a0 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73   ** It is necess
147b0 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62  ary to do this b
147c0 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
147d0 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
147e0 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d  lback.      ** m
147f0 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64  ight be reloaded
14800 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65   at a later time
14810 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69   but at that poi
14820 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65  nt we won't reme
14830 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68  mber.      ** th
14840 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64  at is was marked
14850 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e   alwaysRollback.
14860 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61    This means tha
14870 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74  t all pages must
14880 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6d 61 72  .      ** be mar
14890 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
148a0 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20  lback from here 
148b0 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f  on out..      */
148c0 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
148d0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
148e0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
148f0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
14900 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 1;.      }.. 
14910 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74       /* Unlink t
14920 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d  he old page from
14930 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61   the free list a
14940 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  nd the hash tabl
14950 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  e.      */.     
14960 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
14970 3b 0a 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43  ;.      TEST_INC
14980 52 28 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 29  R(pPager->nOvfl)
14990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
149a0 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
149b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
149c0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
149d0 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f  )pgno<=pPager->o
149e0 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
149f0 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d     sqlite3CheckM
14a00 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49  emory(pPager->aI
14a10 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38  nJournal, pgno/8
14a20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14a30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14a40 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50  Open );.      pP
14a50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28  g->inJournal = (
14a60 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
14a70 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  al[pgno/8] & (1<
14a80 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a  <(pgno&7)))!=0;.
14a90 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
14aa0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ync = 0;.    }el
14ab0 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  se{.      pPg->i
14ac0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
14ad0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
14ae0 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
14af0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
14b00 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e  Stmt && (int)pgn
14b10 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
14b20 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ize.            
14b30 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e   && (pPager->aIn
14b40 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28  Stmt[pgno/8] & (
14b50 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30  1<<(pgno&7)))!=0
14b60 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61   ){.      page_a
14b70 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
14b80 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
14b90 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f  .      page_remo
14ba0 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73  ve_from_stmt_lis
14bb0 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
14bc0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
14bd0 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20  ;.    pPg->nRef 
14be0 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f  = 1;.    REFINFO
14bf0 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65  (pPg);.    pPage
14c00 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68  r->nRef++;.    h
14c10 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67   = pager_hash(pg
14c20 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  no);.    pPg->pN
14c30 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
14c40 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20  ->aHash[h];.    
14c50 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
14c60 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
14c70 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
14c80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14c90 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
14ca0 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
14cb0 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
14cc0 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
14cd0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
14ce0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78   if( pPager->nEx
14cf0 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  tra>0 ){.      m
14d00 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
14d10 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
14d20 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  ), 0, pPager->nE
14d30 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
14d40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
14d50 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  Mask!=0 ){.     
14d60 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
14d70 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ref(PGHDR_TO_DAT
14d80 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72  A(pPg));.      r
14d90 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
14da0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
14db0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14dc0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
14dd0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
14de0 28 70 50 61 67 65 72 29 3c 28 69 6e 74 29 70 67  (pPager)<(int)pg
14df0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  no ){.      mems
14e00 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
14e10 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
14e20 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
14e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
14e40 74 20 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  t rc;.      asse
14e50 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a  rt( MEMDB==0 );.
14e60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14e70 65 33 49 6f 2e 78 53 65 65 6b 28 70 50 61 67 65  e3Io.xSeek(pPage
14e80 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a  r->fd, (pgno-1)*
14e90 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
14ea0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
14eb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14ec0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14ed0 73 71 6c 69 74 65 33 49 6f 2e 78 52 65 61 64 28  sqlite3Io.xRead(
14ee0 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
14ef0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a  R_TO_DATA(pPg),.
14f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
14f20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
14f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
14f40 52 41 43 45 33 28 22 46 45 54 43 48 20 25 64 20  RACE3("FETCH %d 
14f50 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
14f60 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
14f70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
14f80 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
14f90 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
14fa0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
14fb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
14fc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14fd0 20 20 20 69 36 34 20 66 69 6c 65 53 69 7a 65 3b     i64 fileSize;
14fe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
14ff0 69 74 65 33 49 6f 2e 78 46 69 6c 65 53 69 7a 65  ite3Io.xFileSize
15000 28 70 50 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c  (pPager->fd,&fil
15010 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f  eSize)!=SQLITE_O
15020 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
15030 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67   || fileSize>=pg
15040 6e 6f 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  no*pPager->pageS
15050 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
15060 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
15070 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ref(PGHDR_TO_DAT
15080 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20  A(pPg));.       
15090 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
150a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
150b0 20 20 20 20 20 20 20 63 6c 65 61 72 5f 73 69 6d         clear_sim
150c0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28  ulated_io_error(
150d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
150e0 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
150f0 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
15100 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
15110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
15120 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53  lse{.        TES
15130 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
15140 52 65 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Read);.      }. 
15150 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
15160 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
15170 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
15180 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
15190 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
151a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
151b0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
151c0 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
151d0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54   cache. */.    T
151e0 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
151f0 3e 6e 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65  >nHit);.    page
15200 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
15210 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52   *ppPage = PGHDR
15220 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
15230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15240 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
15250 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
15260 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
15270 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
15280 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
15290 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
152a0 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
152b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
152c0 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
152d0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
152e0 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  t in cache..**.*
152f0 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
15300 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20  e3pager_get().  
15310 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
15320 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
15330 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
15340 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73  e3pager_get() is
15350 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
15360 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
15370 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
15380 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
15390 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
153a0 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
153b0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
153c0 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
153d0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
153e0 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
153f0 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
15400 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
15410 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ened..*/.void *s
15420 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
15430 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
15440 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
15450 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
15460 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
15470 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
15480 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  no!=0 );.  if( p
15490 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
154a0 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   ~(PAGER_ERR_FUL
154b0 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  L) ){.    return
154c0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20   0;.  }.  pPg = 
154d0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
154e0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
154f0 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72  ( pPg==0 ) retur
15500 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  n 0;.  page_ref(
15510 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50  pPg);.  return P
15520 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
15530 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
15540 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ase a page..**.*
15550 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
15560 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
15570 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
15580 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
15590 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
155a0 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
155b0 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
155c0 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
155d0 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
155e0 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
155f0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
15600 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
15610 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
15620 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
15630 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f  e3pager_unref(vo
15640 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
15650 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20  Hdr *pPg;..  /* 
15660 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
15670 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
15680 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f  r this page.  */
15690 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  .  pPg = DATA_TO
156a0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
156b0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
156c0 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e  ef>0 );.  pPg->n
156d0 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref--;.  REFINFO
156e0 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  (pPg);..  CHECK_
156f0 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
15700 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
15710 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
15720 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30  o a page reach 0
15730 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  , call the.  ** 
15740 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61  destructor and a
15750 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  dd the page to t
15760 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a  he freelist..  *
15770 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  /.  if( pPg->nRe
15780 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  f==0 ){.    Page
15790 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70  r *pPager;.    p
157a0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
157b0 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  ger;.    pPg->pN
157c0 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  extFree = 0;.   
157d0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
157e0 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b  = pPager->pLast;
157f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
15800 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66  st = pPg;.    if
15810 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
15820 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
15830 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
15840 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ree = pPg;.    }
15850 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
15860 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
15870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15880 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
15890 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72   && pPager->pFir
158a0 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20  stSynced==0 ){. 
158b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
158c0 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b  rstSynced = pPg;
158d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
158e0 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
158f0 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  or ){.      pPag
15900 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
15910 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
15920 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
15930 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61    .    /* When a
15940 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74  ll pages reach t
15950 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f  he freelist, dro
15960 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  p the read lock 
15970 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
15980 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
15990 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
159a0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73  ->nRef--;.    as
159b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
159c0 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ef>=0 );.    if(
159d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
159e0 20 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20   && !MEMDB ){.  
159f0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
15a00 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
15a10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
15a20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
15a30 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c  Create a journal
15a40 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72   file for pPager
15a50 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  .  There should 
15a60 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
15a70 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c  ERVED.** or EXCL
15a80 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
15a90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15aa0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
15ab0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
15ac0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
15ad0 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
15ae0 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  g.  Return an er
15af0 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c  ror code and rel
15b00 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74  ease the.** writ
15b10 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69  e lock if anythi
15b20 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
15b30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15b40 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
15b50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15b60 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
15b70 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
15b80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
15b90 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
15ba0 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ERVED );.  asser
15bb0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
15bc0 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61  alOpen==0 );.  a
15bd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
15be0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
15bf0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
15c00 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
15c10 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70    sqlite3pager_p
15c20 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
15c30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
15c40 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d  ournal = sqliteM
15c50 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
15c60 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
15c70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
15c80 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
15c90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
15ca0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  MEM;.    goto fa
15cb0 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
15cc0 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rnal;.  }.  rc =
15cd0 20 73 71 6c 69 74 65 33 49 6f 2e 78 4f 70 65 6e   sqlite3Io.xOpen
15ce0 45 78 63 6c 75 73 69 76 65 28 70 50 61 67 65 72  Exclusive(pPager
15cf0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
15d00 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20  ger->jfd,.      
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
15d30 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
15d40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15d50 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
15d60 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
15d70 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
15d80 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28  alHdr = 0;.  if(
15d90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15da0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  {.    goto faile
15db0 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
15dc0 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  l;.  }.  sqlite3
15dd0 49 6f 2e 78 53 65 74 46 75 6c 6c 53 79 6e 63 28  Io.xSetFullSync(
15de0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
15df0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a  ger->fullSync);.
15e00 20 20 73 71 6c 69 74 65 33 49 6f 2e 78 53 65 74    sqlite3Io.xSet
15e10 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d  FullSync(pPager-
15e20 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c  >fd, pPager->ful
15e30 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65  lSync);.  sqlite
15e40 33 49 6f 2e 78 4f 70 65 6e 44 69 72 65 63 74 6f  3Io.xOpenDirecto
15e50 72 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  ry(pPager->zDire
15e60 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 6a  ctory, pPager->j
15e70 66 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  fd);.  pPager->j
15e80 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
15e90 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15ea0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
15eb0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
15ec0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
15ed0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
15ee0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
15ef0 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ec = 0;.  if( pP
15f00 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
15f10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
15f20 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
15f30 72 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  r);.    goto fai
15f40 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
15f50 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nal;.  }.  pPage
15f60 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
15f70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
15f80 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75  .  rc = writeJou
15f90 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
15fa0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
15fb0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20  stmtAutoopen && 
15fc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15fd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15fe0 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69  3pager_stmt_begi
15ff0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
16000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16010 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
16020 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
16030 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
16040 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16050 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
16060 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
16070 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
16080 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  ;..failed_to_ope
16090 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c  n_journal:.  sql
160a0 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
160b0 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  aInJournal);.  p
160c0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
160d0 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
160e0 49 6f 2e 78 55 6e 6c 6f 63 6b 28 70 50 61 67 65  Io.xUnlock(pPage
160f0 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
16100 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
16110 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
16120 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16130 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
16140 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
16150 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
16160 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65  e lock is remove
16170 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e  d when.** the an
16180 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
16190 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a  ng happen:.**.**
161a0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
161b0 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20 63  er_commit() is c
161c0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
161d0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
161e0 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
161f0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
16200 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20 69  3pager_close() i
16210 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
16220 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
16230 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
16240 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
16250 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
16260 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
16270 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
16280 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
16290 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
162a0 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
162b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
162c0 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
162d0 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
162e0 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
162f0 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
16300 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
16310 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
16320 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
16330 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
16340 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
16350 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
16360 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
16370 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
16380 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
16390 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
163a0 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
163b0 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
163c0 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
163d0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
163e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
163f0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
16400 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
16410 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
16420 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
16430 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
16440 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
16450 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
16460 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
16470 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
16480 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
16490 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
164a0 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
164b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
164c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
164d0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
164e0 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
164f0 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
16500 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
16510 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69  *.** If exFlag i
16520 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64  s true, go ahead
16530 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c   and get an EXCL
16540 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
16550 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69  e file.** immedi
16560 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ately instead of
16570 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77   waiting until w
16580 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74  e try to flush t
16590 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a  he cache.  The.*
165a0 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f  * exFlag is igno
165b0 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63  red if a transac
165c0 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
165d0 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
165e0 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69  qlite3pager_begi
165f0 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  n(void *pData, i
16600 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 67  nt exFlag){.  Pg
16610 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
16620 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
16630 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
16640 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
16650 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16660 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
16670 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
16680 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16690 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
166a0 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
166b0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
166c0 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
166d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
166e0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
166f0 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
16700 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
16710 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
16720 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
16730 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
16740 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
16750 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
16760 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16770 65 33 49 6f 2e 78 4c 6f 63 6b 28 70 50 61 67 65  e3Io.xLock(pPage
16780 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
16790 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
167a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
167b0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
167c0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
167d0 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
167e0 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
167f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
16800 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
16810 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
16820 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
16830 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16840 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16850 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16860 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16870 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
16880 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
16890 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 54  .      TRACE2("T
168a0 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
168b0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
168c0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ));.      if( pP
168d0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
168e0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
168f0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
16900 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
16910 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
16920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16930 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
16940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
16950 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
16960 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
16970 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
16980 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
16990 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
169a0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
169b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
169c0 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
169d0 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
169e0 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
169f0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
16a00 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
16a10 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
16a20 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
16a30 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
16a40 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
16a50 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
16a60 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
16a70 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
16a80 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
16a90 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
16aa0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
16ab0 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
16ac0 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
16ad0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
16ae0 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
16af0 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
16b00 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
16b10 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
16b20 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
16b30 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
16b40 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
16b50 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
16b60 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
16b70 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
16b80 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
16b90 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
16ba0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
16bb0 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
16bc0 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
16bd0 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
16be0 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
16bf0 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
16c00 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
16c10 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
16c20 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
16c30 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
16c40 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  _commit() or sql
16c50 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
16c60 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
16c70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16c80 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64  pager_write(void
16c90 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
16ca0 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
16cb0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
16cc0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
16cd0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
16ce0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16cf0 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
16d00 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
16d10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
16d20 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65  rMask ){ .    re
16d30 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f  turn pager_errco
16d40 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  de(pPager);.  }.
16d50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
16d60 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
16d70 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
16d80 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
16d90 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
16da0 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  ter );..  CHECK_
16db0 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
16dc0 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
16dd0 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
16de0 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
16df0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
16e00 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
16e10 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
16e20 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
16e30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69  ..  */.  pPg->di
16e40 72 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  rty = 1;.  if( p
16e50 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
16e60 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c   (pPg->inStmt ||
16e70 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
16e80 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50  se==0) ){.    pP
16e90 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
16ea0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
16eb0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
16ec0 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
16ed0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
16ee0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
16ef0 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
16f00 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
16f10 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
16f20 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
16f30 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
16f40 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
16f50 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
16f60 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
16f70 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
16f80 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a  exists and.    *
16f90 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
16fa0 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20  t does not..    
16fb0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
16fc0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
16fd0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
16fe0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
16ff0 67 65 72 5f 62 65 67 69 6e 28 70 44 61 74 61 2c  ger_begin(pData,
17000 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
17010 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17020 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17030 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
17040 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
17050 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
17060 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
17070 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
17080 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
17090 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
170a0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
170b0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
170c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
170d0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
170e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
170f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
17100 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50  urnalOpen || !pP
17110 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
17120 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
17130 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
17140 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
17150 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
17160 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
17170 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
17180 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
17190 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
171a0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
171b0 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
171c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
171d0 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
171e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
171f0 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
17200 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
17210 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17220 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
17230 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a  && (pPager->useJ
17240 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29  ournal || MEMDB)
17250 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69   ){.      if( (i
17260 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
17270 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
17280 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ze ){.        in
17290 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20  t szPg;.        
172a0 75 33 32 20 73 61 76 65 64 3b 0a 20 20 20 20 20  u32 saved;.     
172b0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
172c0 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73 74            PgHist
172d0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
172e0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
172f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
17300 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52 4e     TRACE3("JOURN
17310 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
17320 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
17330 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
17340 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17350 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30   pHist->pOrig==0
17360 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48   );.          pH
17370 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c  ist->pOrig = sql
17380 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
17390 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
173a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
173b0 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
173c0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
173d0 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  py(pHist->pOrig,
173e0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
173f0 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
17400 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
17410 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
17420 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  e{.          u32
17430 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20   cksum;.        
17440 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
17450 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
17460 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
17470 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
17480 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
17490 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
174a0 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
174b0 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
174c0 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20 20  ifies.          
174d0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
174e0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
174f0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
17500 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
17510 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
17520 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
17530 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
17540 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
17550 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
17560 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
17570 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61  pPg->pgno, pData
17580 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76  );.          sav
17590 65 64 20 3d 20 2a 28 75 33 32 2a 29 50 47 48 44  ed = *(u32*)PGHD
175a0 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
175b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
175c0 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63     store32bits(c
175d0 6b 73 75 6d 2c 20 70 50 67 2c 20 70 50 61 67 65  ksum, pPg, pPage
175e0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
175f0 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70          szPg = p
17600 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
17610 38 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  8;.          sto
17620 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67  re32bits(pPg->pg
17630 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20  no, pPg, -4);.  
17640 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
17650 69 74 65 33 49 6f 2e 78 57 72 69 74 65 28 70 50  ite3Io.xWrite(pP
17660 61 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68  ager->jfd, &((ch
17670 61 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20  ar*)pData)[-4], 
17680 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  szPg);.         
17690 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
176a0 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20  Off += szPg;.   
176b0 20 20 20 20 20 20 20 54 52 41 43 45 34 28 22 4a         TRACE4("J
176c0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
176d0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
176e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
176f0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
17700 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
17710 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  pPg->needSync);.
17720 20 20 20 20 20 20 20 20 20 20 43 4f 44 45 43 28            CODEC(
17730 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
17740 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  Pg->pgno, 0);.  
17750 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 50          *(u32*)P
17760 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
17770 67 2c 20 70 50 61 67 65 72 29 20 3d 20 73 61 76  g, pPager) = sav
17780 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ed;.          if
17790 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
177a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
177b0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
177c0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
177d0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
177e0 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
177f0 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20  ER_ERR_FULL;.   
17800 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17810 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rc;.          }.
17820 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
17830 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
17840 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
17850 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
17860 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
17870 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
17880 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  l[pPg->pgno/8] |
17890 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
178a0 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  7);.          pP
178b0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
178c0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
178d0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
178e0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
178f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  {.            pP
17900 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
17910 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
17920 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
17930 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
17940 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
17950 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  t(pPg);.        
17960 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
17970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17980 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
17990 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72   = !pPager->jour
179a0 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
179b0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
179c0 20 20 20 20 20 20 20 54 52 41 43 45 34 28 22 41         TRACE4("A
179d0 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
179e0 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
179f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a00 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
17a10 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
17a20 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
17a30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
17a40 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
17a50 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17a60 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
17a70 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
17a80 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
17a90 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
17aa0 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
17ab0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
17ac0 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
17ad0 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
17ae0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
17af0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
17b00 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
17b10 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
17b20 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
17b30 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
17b40 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
17b50 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
17b60 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
17b70 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
17b80 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
17b90 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
17ba0 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
17bb0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17bc0 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d  mtInUse && !pPg-
17bd0 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29  >inStmt && (int)
17be0 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
17bf0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20  r->stmtSize ){. 
17c00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
17c10 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
17c20 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
17c30 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
17c40 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45   );.      if( ME
17c50 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50  MDB ){.        P
17c60 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
17c70 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
17c80 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
17c90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
17ca0 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b  ist->pStmt==0 );
17cb0 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
17cc0 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61  pStmt = sqliteMa
17cd0 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
17ce0 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
17cf0 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
17d00 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
17d10 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
17d20 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f  >pStmt, PGHDR_TO
17d30 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
17d40 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
17d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17d60 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f   TRACE3("STMT-JO
17d70 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
17d80 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
17d90 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
17da0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17db0 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69         store32bi
17dc0 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ts(pPg->pgno, pP
17dd0 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20  g, -4);.        
17de0 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
17df0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
17e00 37 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  7);.        rc =
17e10 20 73 71 6c 69 74 65 33 49 6f 2e 78 57 72 69 74   sqlite3Io.xWrit
17e20 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 28  e(pPager->stfd,(
17e30 28 63 68 61 72 2a 29 70 44 61 74 61 29 2d 34 2c  (char*)pData)-4,
17e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e60 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17e70 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  +4);.        TRA
17e80 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
17e90 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
17ea0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
17eb0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
17ec0 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
17ed0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
17ee0 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
17ef0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17f00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
17f10 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
17f20 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
17f30 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
17f40 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
17f50 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20  ER_ERR_FULL;.   
17f60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17f70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17f80 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
17f90 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  NRec++;.        
17fa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17fb0 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
17fc0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
17fd0 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
17fe0 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
17ff0 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a  gno&7);.      }.
18000 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
18010 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
18020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
18030 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
18040 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
18050 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  eturn..  */.  if
18060 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
18070 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  <(int)pPg->pgno 
18080 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
18090 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
180a0 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  o;.    if( !MEMD
180b0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  B && pPager->dbS
180c0 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ize==PENDING_BYT
180d0 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  E/pPager->pageSi
180e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
180f0 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20  er->dbSize++;.  
18100 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
18110 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
18120 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
18130 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
18140 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
18150 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
18160 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70  d.** to sqlite3p
18170 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49  ager_write().  I
18180 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
18190 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
181a0 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
181b0 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
181c0 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
181d0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
181e0 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69  _iswriteable(voi
181f0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
18200 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
18210 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
18220 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69    return pPg->di
18230 72 74 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  rty;.}..#ifndef 
18240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
18250 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65  UM./*.** Replace
18260 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
18270 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69  a single page wi
18280 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  th the informati
18290 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a  on in the third.
182a0 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
182b0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
182c0 5f 6f 76 65 72 77 72 69 74 65 28 50 61 67 65 72  _overwrite(Pager
182d0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
182e0 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61  gno, void *pData
182f0 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65  ){.  void *pPage
18300 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
18310 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
18320 5f 67 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  _get(pPager, pgn
18330 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66  o, &pPage);.  if
18340 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18350 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
18360 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
18370 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
18380 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18390 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
183a0 67 65 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  ge, pData, pPage
183b0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
183c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70    }.    sqlite3p
183d0 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
183e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
183f0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
18400 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
18410 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
18420 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
18430 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
18440 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
18450 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
18460 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62  on page "pgno" b
18470 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
18480 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
18490 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
184a0 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
184b0 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  ty..**.** The ov
184c0 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
184d0 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
184e0 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
184f0 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
18500 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
18510 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20  age is unused.  
18520 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
18530 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
18540 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
18550 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
18560 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
18570 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
18580 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
18590 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20  ation, together 
185a0 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  with the.** sqli
185b0 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  te3pager_dont_ro
185c0 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20  llback() below, 
185d0 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65  more than double
185e0 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66   the speed.** of
185f0 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70   large INSERT op
18600 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61  erations and qua
18610 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
18620 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45   of large DELETE
18630 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  s..**.** When th
18640 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
18650 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c  lled, set the al
18660 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
18670 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75  g to true..** Su
18680 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
18690 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  o sqlite3pager_d
186a0 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
186b0 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  or the same page
186c0 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66  .** will thereaf
186d0 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20  ter be ignored. 
186e0 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
186f0 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72  ry to avoid a pr
18700 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61  oblem.** where a
18710 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20   page with data 
18720 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
18730 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
18740 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61  one part of.** a
18750 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
18760 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  n removed from t
18770 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
18780 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a  ng a later part.
18790 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74  ** of the same t
187a0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72  ransaction and r
187b0 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f  eused for some o
187c0 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57  ther purpose.  W
187d0 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72  hen it.** is fir
187e0 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  st added to the 
187f0 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72  freelist, this r
18800 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
18810 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a  .  When reused,.
18820 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  ** the dont_roll
18830 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69  back() routine i
18840 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62  s called.  But b
18850 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
18860 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74  contains.** crit
18870 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74  ical data, we st
18880 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
18890 75 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c  ure it gets roll
188a0 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
188b0 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f  .** of the dont_
188c0 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  rollback() call.
188d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
188e0 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65  pager_dont_write
188f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
18900 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
18910 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
18920 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
18930 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
18940 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
18950 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77  gno);.  pPg->alw
18960 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
18970 0a 20 20 69 66 28 20 70 50 67 20 26 26 20 70 50  .  if( pPg && pP
18980 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
18990 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
189a0 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67  ze==(int)pPg->pg
189b0 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72  no && pPager->or
189c0 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  igDbSize<pPager-
189d0 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
189e0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
189f0 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  s is the last pa
18a00 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61  ge in the file a
18a10 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
18a20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64  grown.      ** d
18a30 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
18a40 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
18a50 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20  hen do NOT mark 
18a60 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
18a70 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  n..      ** When
18a80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18a90 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73  le grows, we mus
18aa0 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  t make sure that
18ab0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20   the last page. 
18ac0 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69       ** gets wri
18ad0 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tten at least on
18ae0 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64  ce so that the d
18af0 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  isk file will be
18b00 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
18b10 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79     ** size. If y
18b20 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  ou do not write 
18b30 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68  this page and th
18b40 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
18b50 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
18b60 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20  he disk ends up 
18b70 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c  being too small,
18b80 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74   that can lead t
18b90 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  o database.     
18ba0 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64   ** corruption d
18bb0 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74  uring the next t
18bc0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
18bd0 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
18be0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 44 4f        TRACE3("DO
18bf0 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64  NT_WRITE page %d
18c00 20 6f 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c   of %d\n", pgno,
18c10 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
18c20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  );.      pPg->di
18c30 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  rty = 0;.#ifdef 
18c40 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
18c50 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  ES.      pPg->pa
18c60 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
18c70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
18c80 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ndif.    }.  }.}
18c90 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
18ca0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
18cb0 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
18cc0 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63  hat if a rollbac
18cd0 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20  k occurs,.** it 
18ce0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
18cf0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
18d00 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65  data on the give
18d10 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a  n page.  This.**
18d20 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
18d30 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68  pager does not h
18d40 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68  ave to record th
18d50 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20  e given page in 
18d60 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  the.** rollback 
18d70 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64  journal..*/.void
18d80 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
18d90 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64  nt_rollback(void
18da0 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
18db0 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
18dc0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
18dd0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
18de0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
18df0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
18e00 74 65 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te!=PAGER_EXCLUS
18e10 49 56 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  IVE || pPager->j
18e20 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20  ournalOpen==0 ) 
18e30 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
18e40 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
18e50 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77  k || pPager->alw
18e60 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d  aysRollback || M
18e70 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  EMDB ) return;. 
18e80 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
18e90 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67  rnal && (int)pPg
18ea0 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
18eb0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
18ec0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18ed0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
18ee0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
18ef0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
18f00 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
18f10 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
18f20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
18f30 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
18f40 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
18f50 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
18f60 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
18f70 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
18f80 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
18f90 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
18fa0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
18fb0 20 7d 0a 20 20 20 20 54 52 41 43 45 33 28 22 44   }.    TRACE3("D
18fc0 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67  ONT_ROLLBACK pag
18fd0 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
18fe0 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
18ff0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a  D(pPager));.  }.
19000 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19010 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d  mtInUse && !pPg-
19020 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29  >inStmt && (int)
19030 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
19040 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20  r->stmtSize ){. 
19050 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
19060 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
19070 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
19080 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
19090 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
190a0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
190b0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
190c0 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
190d0 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
190e0 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61  >pgno&7);.    pa
190f0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
19100 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a  ist(pPg);.  }.}.
19110 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19120 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f  _OMIT_MEMORYDB./
19130 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48  *.** Clear a PgH
19140 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a  istory block.*/.
19150 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
19160 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f  rHistory(PgHisto
19170 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71  ry *pHist){.  sq
19180 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
19190 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65  pOrig);.  sqlite
191a0 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
191b0 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72  t);.  pHist->pOr
191c0 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d  ig = 0;.  pHist-
191d0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65  >pStmt = 0;.}.#e
191e0 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61  lse.#define clea
191f0 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64  rHistory(x).#end
19200 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  if../*.** Commit
19210 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
19220 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
19230 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
19240 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
19250 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
19260 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
19270 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
19280 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
19290 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
192a0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
192b0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
192c0 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
192d0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
192e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
192f0 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65  ager_commit(Page
19300 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
19310 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
19320 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
19330 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45  r->errMask==PAGE
19340 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
19350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
19360 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
19370 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
19380 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19390 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
193a0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  _FULL;.    }.   
193b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
193c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
193d0 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
193e0 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
193f0 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
19400 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
19410 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
19420 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
19430 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
19440 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
19450 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d  }.  TRACE2("COMM
19460 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
19470 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
19480 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
19490 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
194a0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
194b0 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c  Pager);.    whil
194c0 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  e( pPg ){.      
194d0 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48  clearHistory(PGH
194e0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
194f0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
19500 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
19510 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
19520 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
19530 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pPg->inStmt = 0;
19540 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
19550 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  vStmt = pPg->pNe
19560 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
19570 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69    pPg = pPg->pDi
19580 72 74 79 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  rty;.    }.#ifnd
19590 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f  ef NDEBUG.    fo
195a0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
195b0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
195c0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
195d0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
195e0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
195f0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
19600 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19610 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  !pPg->alwaysRoll
19620 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73  back );.      as
19630 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f  sert( !pHist->pO
19640 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rig );.      ass
19650 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74  ert( !pHist->pSt
19660 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  mt );.    }.#end
19670 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  if.    pPager->p
19680 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
19690 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
196a0 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
196b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
196c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
196d0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
196e0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74  0 ){.    /* Exit
196f0 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20   early (without 
19700 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63  doing the time-c
19710 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33  onsuming sqlite3
19720 49 6f 2e 78 53 79 6e 63 28 29 20 63 61 6c 6c 73  Io.xSync() calls
19730 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72  ).    ** if ther
19740 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63  e have been no c
19750 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
19760 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
19770 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19780 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  er->needSync==0 
19790 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
197a0 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
197b0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
197c0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
197d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
197e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
197f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
19800 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
19810 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 50 61  e3pager_sync(pPa
19820 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  ger, 0, 0);.  if
19830 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19840 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d  ){.    goto comm
19850 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  it_abort;.  }.  
19860 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
19870 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
19880 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
19890 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20   = -1;.  return 
198a0 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  rc;..  /* Jump h
198b0 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ere if anything 
198c0 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69 6e  goes wrong durin
198d0 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
198e0 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69  cess..  */.commi
198f0 74 5f 61 62 6f 72 74 3a 0a 20 20 73 71 6c 69 74  t_abort:.  sqlit
19900 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
19910 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
19920 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19930 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
19940 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
19950 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
19960 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
19970 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
19980 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
19990 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
199a0 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
199b0 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
199c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
199d0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
199e0 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
199f0 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
19a00 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
19a10 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
19a20 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a30 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28  cking protocol (
19a40 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29  SQLITE_PROTOCOL)
19a50 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20   or unless some 
19a60 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
19a70 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73   is writing tras
19a80 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  h into the journ
19a90 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f  al file (SQLITE_
19aa0 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75  CORRUPT) or.** u
19ab0 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61  nless a prior ma
19ac0 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53  lloc() failed (S
19ad0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41  QLITE_NOMEM).  A
19ae0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
19af0 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65  .** codes are re
19b00 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74  turned for all t
19b10 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20  hese occasions. 
19b20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53   Otherwise,.** S
19b30 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
19b40 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
19b50 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
19b60 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
19b70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54  ){.  int rc;.  T
19b80 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE2("ROLLBACK 
19b90 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
19ba0 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
19bb0 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64  EMDB ){.    PgHd
19bc0 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  r *p;.    for(p=
19bd0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
19be0 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
19bf0 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
19c00 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61   *pHist;.      a
19c10 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79  ssert( !p->alway
19c20 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
19c30 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79     if( !p->dirty
19c40 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
19c50 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
19c60 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
19c70 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f  (p, pPager))->pO
19c80 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61  rig );.        a
19c90 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
19ca0 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
19cb0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
19cc0 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  >pStmt );.      
19cd0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
19ce0 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74    }..      pHist
19cf0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
19d00 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  (p, pPager);.   
19d10 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
19d20 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  rig ){.        m
19d30 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
19d40 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70  ATA(p), pHist->p
19d50 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  Orig, pPager->pa
19d60 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
19d70 20 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43   TRACE3("ROLLBAC
19d80 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c  K-PAGE %d of %d\
19d90 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
19da0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
19db0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19dc0 20 20 20 20 54 52 41 43 45 33 28 22 50 41 47 45      TRACE3("PAGE
19dd0 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20   %d is clean on 
19de0 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
19df0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
19e00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19e10 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
19e20 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  st);.      p->di
19e30 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
19e40 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
19e50 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74  .      p->inStmt
19e60 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
19e70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e  PrevStmt = p->pN
19e80 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20  extStmt = 0;..  
19e90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
19ea0 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
19eb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
19ec0 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f  initer(PGHDR_TO_
19ed0 44 41 54 41 28 70 29 2c 20 70 50 61 67 65 72 2d  DATA(p), pPager-
19ee0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
19ef0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 7d    }.      .    }
19f00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
19f10 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
19f20 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
19f30 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
19f40 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63  .    memoryTrunc
19f50 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
19f60 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
19f70 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
19f80 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
19f90 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
19fa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19fb0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
19fc0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c  er->dirtyCache |
19fd0 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | !pPager->journ
19fe0 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  alOpen ){.    rc
19ff0 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
1a000 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
1a010 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1a020 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72   = -1;.    retur
1a030 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
1a040 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
1a050 21 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  !=0 && pPager->e
1a060 72 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45 52  rrMask!=PAGER_ER
1a070 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  R_FULL ){.    if
1a080 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1a090 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
1a0a0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
1a0b0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
1a0c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1a0d0 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
1a0e0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1a0f0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1a100 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
1a110 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  D ){.    int rc2
1a120 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1a130 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
1a140 61 67 65 72 29 3b 0a 20 20 20 20 72 63 32 20 3d  ager);.    rc2 =
1a150 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
1a160 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1a170 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a180 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1a190 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  rc2;.    }.  }el
1a1a0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
1a1b0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
1a1c0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
1a1d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a1e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a1f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1a200 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
1a210 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43  k |= PAGER_ERR_C
1a220 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50  ORRUPT;.  }.  pP
1a230 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
1a240 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
1a250 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a260 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
1a270 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
1a280 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
1a290 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
1a2a0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1a2b0 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
1a2c0 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  ritable..*/.int 
1a2d0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 72  sqlite3pager_isr
1a2e0 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70  eadonly(Pager *p
1a2f0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1a300 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
1a310 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  y;.}../*.** This
1a320 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1a330 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
1a340 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
1a350 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 70  */.int *sqlite3p
1a360 61 67 65 72 5f 73 74 61 74 73 28 50 61 67 65 72  ager_stats(Pager
1a370 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61   *pPager){.  sta
1a380 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20  tic int a[11];. 
1a390 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[0] = pPager->
1a3a0 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70  nRef;.  a[1] = p
1a3b0 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20  Pager->nPage;.  
1a3c0 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d  a[2] = pPager->m
1a3d0 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20  xPage;.  a[3] = 
1a3e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1a3f0 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
1a400 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
1a410 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
1a420 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1a430 54 45 53 54 0a 20 20 61 5b 36 5d 20 3d 20 70 50  TEST.  a[6] = pP
1a440 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b  ager->nHit;.  a[
1a450 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69  7] = pPager->nMi
1a460 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61  ss;.  a[8] = pPa
1a470 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b  ger->nOvfl;.  a[
1a480 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
1a490 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
1a4a0 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 23 65  ager->nWrite;.#e
1a4b0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 61 3b  ndif.  return a;
1a4c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1a4d0 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  e statement roll
1a4e0 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a  back point..**.*
1a4f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1a500 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
1a510 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63  with the transac
1a520 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72  tion journal alr
1a530 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41  eady.** open.  A
1a540 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a   new statement j
1a550 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65  ournal is create
1a560 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  d that can be us
1a570 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ed to rollback.*
1a580 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73  * changes of a s
1a590 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e  ingle SQL comman
1a5a0 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65  d within a large
1a5b0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  r transaction..*
1a5c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1a5d0 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50 61  er_stmt_begin(Pa
1a5e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1a5f0 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
1a600 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
1a610 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73  NAME_SIZE];.  as
1a620 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
1a630 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73  tmtInUse );.  as
1a640 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
1a650 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41  Size>=0 );.  TRA
1a660 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20  CE2("STMT-BEGIN 
1a670 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1a680 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
1a690 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
1a6a0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1a6b0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
1a6c0 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
1a6d0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65  ->dbSize;.    re
1a6e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a6f0 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
1a700 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1a710 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
1a720 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a  mtAutoopen = 1;.
1a730 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a740 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
1a750 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1a760 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61  nalOpen );.  pPa
1a770 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73  ger->aInStmt = s
1a780 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
1a790 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
1a7a0 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
1a7b0 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b  r->aInStmt==0 ){
1a7c0 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 2e 78  .    sqlite3Io.x
1a7d0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
1a7e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
1a7f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a800 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e  _NOMEM;.  }.#ifn
1a810 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20  def NDEBUG.  rc 
1a820 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 46 69 6c  = sqlite3Io.xFil
1a830 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
1a840 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74  d, &pPager->stmt
1a850 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
1a860 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
1a870 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73  in_failed;.  ass
1a880 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
1a890 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72  tJSize == pPager
1a8a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
1a8b0 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d  #endif.  pPager-
1a8c0 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61  >stmtJSize = pPa
1a8d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
1a8e0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  .  pPager->stmtS
1a8f0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1a900 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
1a910 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a  stmtHdrOff = 0;.
1a920 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b    pPager->stmtCk
1a930 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
1a940 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21  sumInit;.  if( !
1a950 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
1a960 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1a970 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
1a980 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65  mp(zTemp, &pPage
1a990 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66  r->stfd);.    if
1a9a0 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
1a9b0 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
1a9c0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
1a9d0 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
1a9e0 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
1a9f0 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
1aa00 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
1aa10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1aa20 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
1aa30 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
1aa40 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
1aa50 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1aa60 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
1aa70 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1aa80 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
1aa90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1aaa0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
1aab0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
1aac0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1aad0 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  mt_commit(Pager 
1aae0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1aaf0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1ab00 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
1ab10 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
1ab20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f   TRACE2("STMT-CO
1ab30 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
1ab40 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1ab50 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
1ab60 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 2e        sqlite3Io.
1ab70 78 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74  xSeek(pPager->st
1ab80 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a  fd, 0);.      /*
1ab90 20 73 71 6c 69 74 65 33 49 6f 2e 78 54 72 75 6e   sqlite3Io.xTrun
1aba0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66  cate(pPager->stf
1abb0 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20  d, 0); */.      
1abc0 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
1abd0 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20  er->aInStmt );. 
1abe0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
1abf0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
1ac00 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
1ac10 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
1ac20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
1ac30 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
1ac40 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20  NextStmt;.      
1ac50 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53  assert( pPg->inS
1ac60 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67  tmt );.      pPg
1ac70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
1ac80 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
1ac90 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
1aca0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
1acb0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1acc0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1acd0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
1ace0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
1acf0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1ad00 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
1ad10 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  mt);.        pHi
1ad20 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
1ad30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ad40 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
1ad50 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
1ad60 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
1ad70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
1ad80 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  tmt = 0;.  }.  p
1ad90 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
1ada0 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
1adb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1adc0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
1add0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
1ade0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1adf0 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61  stmt_rollback(Pa
1ae00 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1ae10 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50  int rc;.  if( pP
1ae20 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1ae30 29 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53  ){.    TRACE2("S
1ae40 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  TMT-ROLLBACK %d\
1ae50 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1ae60 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  er));.    if( ME
1ae70 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48  MDB ){.      PgH
1ae80 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66  dr *pPg;.      f
1ae90 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
1aea0 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
1aeb0 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a  Pg->pNextStmt){.
1aec0 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
1aed0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
1aee0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1aef0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
1af00 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  f( pHist->pStmt 
1af10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
1af20 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
1af30 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70  A(pPg), pHist->p
1af40 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61  Stmt, pPager->pa
1af50 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
1af60 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48     sqliteFree(pH
1af70 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
1af80 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
1af90 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
1afa0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1afb0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1afc0 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  = pPager->stmtSi
1afd0 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79  ze;.      memory
1afe0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
1aff0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1b000 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1b010 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
1b020 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
1b030 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
1b040 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
1b050 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50  r_stmt_commit(pP
1b060 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
1b070 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b080 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
1b090 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
1b0a0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
1b0b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1b0c0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
1b0d0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1b0e0 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
1b0f0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70  t char *sqlite3p
1b100 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61  ager_filename(Pa
1b110 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1b120 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
1b130 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
1b140 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69  ** Return the di
1b150 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64  rectory of the d
1b160 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
1b170 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1b180 69 74 65 33 70 61 67 65 72 5f 64 69 72 6e 61 6d  ite3pager_dirnam
1b190 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1b1a0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1b1b0 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d  r->zDirectory;.}
1b1c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1b1d0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
1b1e0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b1f0 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
1b200 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
1b210 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61  r_journalname(Pa
1b220 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1b230 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
1b240 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  Journal;.}../*.*
1b250 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1b260 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61   fsync() calls a
1b270 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  re disabled for 
1b280 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74  this pager.  Ret
1b290 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
1b2a0 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65  fsync()s are exe
1b2b0 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a  cuted normally..
1b2c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1b2d0 67 65 72 5f 6e 6f 73 79 6e 63 28 50 61 67 65 72  ger_nosync(Pager
1b2e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1b2f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  urn pPager->noSy
1b300 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  nc;.}../*.** Set
1b310 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74   the codec for t
1b320 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69  his pager.*/.voi
1b330 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
1b340 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65  et_codec(.  Page
1b350 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
1b360 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64  d (*xCodec)(void
1b370 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
1b380 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  ),.  void *pCode
1b390 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72  cArg.){.  pPager
1b3a0 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65  ->xCodec = xCode
1b3b0 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f  c;.  pPager->pCo
1b3c0 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41  decArg = pCodecA
1b3d0 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rg;.}../*.** Thi
1b3e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1b3f0 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
1b400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b410 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
1b420 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
1b430 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
1b440 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
1b450 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
1b460 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
1b470 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
1b480 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b  {.  void *pPage;
1b490 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72  .  PgHdr *pPgHdr
1b4a0 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  ;.  u32 change_c
1b4b0 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63  ounter;.  int rc
1b4c0 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67  ;..  /* Open pag
1b4d0 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20  e 1 of the file 
1b4e0 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a  for writing. */.
1b4f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1b500 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
1b510 31 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66  1, &pPage);.  if
1b520 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b530 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
1b540 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1b550 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
1b560 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b570 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1b580 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63  .  /* Read the c
1b590 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20  urrent value at 
1b5a0 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50  byte 24. */.  pP
1b5b0 67 48 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50  gHdr = DATA_TO_P
1b5c0 47 48 44 52 28 70 50 61 67 65 29 3b 0a 20 20 63  GHDR(pPage);.  c
1b5d0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
1b5e0 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70  retrieve32bits(p
1b5f0 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f  PgHdr, 24);..  /
1b600 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1b610 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
1b620 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
1b630 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
1b640 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
1b650 72 2b 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62 69  r++;.  store32bi
1b660 74 73 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  ts(change_counte
1b670 72 2c 20 70 50 67 48 64 72 2c 20 32 34 29 3b 0a  r, pPgHdr, 24);.
1b680 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68  .  /* Release th
1b690 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
1b6a0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61  . */.  sqlite3pa
1b6b0 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29  ger_unref(pPage)
1b6c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1b6d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
1b6e0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1b6f0 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61   file for the pa
1b700 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73  ger pPager. zMas
1b710 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
1b720 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d  e name.** of a m
1b730 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1b740 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
1b750 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1b760 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a  he individual.**
1b770 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a   journal file. z
1b780 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55  Master may be NU
1b790 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74  LL, which is int
1b7a0 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d  erpreted as no m
1b7b0 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
1b7c0 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62   (a single datab
1b7d0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
1b7e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b7f0 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
1b800 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
1b810 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72   synced, all dir
1b820 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ty pages written
1b830 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
1b840 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
1b850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1b860 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20  ynced. The only 
1b870 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65  thing that.** re
1b880 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
1b890 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b8a0 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
1b8b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
1b8c0 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  r.** master jour
1b8d0 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63  nal file if spec
1b8e0 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ified)..**.** No
1b8f0 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74  te that if zMast
1b900 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64  er==NULL, this d
1b910 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74  oes not overwrit
1b920 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c  e a previous val
1b930 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  ue.** passed to 
1b940 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  an sqlite3pager_
1b950 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a  sync() call..**.
1b960 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
1b970 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65  nTrunc is non-ze
1b980 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ro, then the pag
1b990 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  er file is trunc
1b9a0 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e  ated to.** nTrun
1b9b0 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73  c pages (this is
1b9c0 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
1b9d0 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e  cuum databases).
1b9e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1b9f0 61 67 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20  ager_sync(Pager 
1ba00 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
1ba10 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67  har *zMaster, Pg
1ba20 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e  no nTrunc){.  in
1ba30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ba40 3b 0a 0a 20 20 54 52 41 43 45 34 28 22 44 41 54  ;..  TRACE4("DAT
1ba50 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
1ba60 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
1ba70 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20  Trunc=%d\n", .  
1ba80 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c      pPager->zFil
1ba90 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20  ename, zMaster, 
1baa0 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49  nTrunc);..  /* I
1bab0 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
1bac0 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
1bad0 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
1bae0 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
1baf0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
1bb00 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
1bb10 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
1bb20 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
1bb30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1bb40 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
1bb50 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70  D && !MEMDB && p
1bb60 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1bb70 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
1bb80 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pPg;.    assert(
1bb90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bba0 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Open );..    /* 
1bbb0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
1bbc0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
1bbd0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
1bbe0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20  ritten to the.  
1bbf0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
1bc00 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20  e, then no sync 
1bc10 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  is required. Thi
1bc20 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69  s happens when i
1bc30 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74  t is.    ** writ
1bc40 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72  ten, then the pr
1bc50 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75  ocess fails to u
1bc60 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
1bc70 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20  SERVED to an.   
1bc80 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
1bc90 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d  ck. The next tim
1bca0 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72  e the process tr
1bcb0 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ies to commit th
1bcc0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
1bcd0 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d  tion the m-j nam
1bce0 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
1bcf0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1bd00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1bd10 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
1bd20 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ter ){.      rc 
1bd30 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
1bd40 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
1bd50 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1bd60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1bd70 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69  to sync_exit;.#i
1bd80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bd90 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1bda0 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
1bdb0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
1bdc0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1bdd0 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
1bde0 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
1bdf0 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
1be00 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  .        ** bein
1be10 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74  g discarded by t
1be20 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75  he truncation mu
1be30 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  st be written to
1be40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
1be50 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20       ** file..  
1be60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1be70 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20   Pgno i;.       
1be80 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
1be90 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20        int iSkip 
1bea0 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
1beb0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1bec0 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31   for( i=nTrunc+1
1bed0 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  ; i<=pPager->ori
1bee0 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a  gDbSize; i++ ){.
1bef0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
1bf00 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1bf10 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69  al[i/8] & (1<<(i
1bf20 26 37 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69  &7))) && i!=iSki
1bf30 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p ){.           
1bf40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1bf50 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 69  er_get(pPager, i
1bf60 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
1bf70 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1bf80 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1bf90 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
1bfa0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1bfb0 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
1bfc0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1bfd0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
1bfe0 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
1bff0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1c000 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1c010 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1c020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c030 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e    } .      }.#en
1c040 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77  dif.      rc = w
1c050 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
1c060 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
1c070 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1c080 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1c090 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1c0a0 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
1c0b0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1c0c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c0d0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1c0e0 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23  c_exit;.    }..#
1c0f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c100 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1c110 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
1c120 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1c130 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63  lite3pager_trunc
1c140 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
1c150 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nc);.      if( r
1c160 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1c170 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1c180 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1c190 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
1c1a0 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
1c1b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1c1c0 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
1c1d0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
1c1e0 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
1c1f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1c200 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
1c210 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1c220 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1c230 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20  sync_exit;..    
1c240 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  /* Sync the data
1c250 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1c260 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
1c270 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
1c280 63 20 3d 20 73 71 6c 69 74 65 33 49 6f 2e 78 53  c = sqlite3Io.xS
1c290 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
1c2a0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  0);.    }..    p
1c2b0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1c2c0 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
1c2d0 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72  ..sync_exit:.  r
1c2e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1c2f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c300 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
1c310 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
1c320 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44  identified by pD
1c330 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  ata to location 
1c340 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
1c350 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  . .**.** There m
1c360 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
1c370 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75 72 72  nces to the curr
1c380 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49  ent page pgno. I
1c390 66 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a  f current page.*
1c3a0 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  * pgno is not al
1c3b0 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c  ready in the rol
1c3c0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
1c3d0 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  t is not written
1c3e0 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20   there by.** by 
1c3f0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68  this routine. Th
1c400 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74  e same applies t
1c410 6f 20 74 68 65 20 70 61 67 65 20 70 44 61 74 61  o the page pData
1c420 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e   refers to on en
1c430 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  try to.** this r
1c440 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
1c450 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1c460 70 61 67 65 20 72 65 66 65 72 65 64 20 74 6f 20  page refered to 
1c470 62 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20  by pData remain 
1c480 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
1c490 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
1c4a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1c4b0 20 70 61 67 65 20 70 44 61 74 61 20 28 69 2e 65   page pData (i.e
1c4c0 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
1c4d0 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
1c4e0 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
1c4f0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
1c500 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
1c510 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
1c520 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
1c530 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
1c540 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
1c550 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1c560 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
1c570 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
1c580 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
1c590 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1c5a0 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
1c5b0 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
1c5c0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
1c5d0 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
1c5e0 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
1c5f0 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
1c600 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
1c610 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1c620 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73  ctive)..*/.int s
1c630 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65  qlite3pager_move
1c640 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
1c650 65 72 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  er, void *pData,
1c660 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
1c670 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
1c680 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
1c690 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  ;.  PgHdr *pPgOl
1c6a0 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50  d; .  int h;.  P
1c6b0 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  gno needSyncPgno
1c6c0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1c6d0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
1c6e0 0a 20 20 54 52 41 43 45 35 28 22 4d 4f 56 45 20  .  TRACE5("MOVE 
1c6f0 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64  %d page %d (need
1c700 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74  Sync=%d) moves t
1c710 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  o %d\n", .      
1c720 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1c730 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
1c740 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29  >needSync, pgno)
1c750 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  ;..  if( pPg->ne
1c760 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65  edSync ){.    ne
1c770 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
1c780 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
1c790 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1c7a0 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
1c7b0 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a  ( pPg->dirty );.
1c7c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c7d0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
1c7e0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
1c7f0 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68   pPg from it's h
1c800 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75  ash-chain */.  u
1c810 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
1c820 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20  Pager, pPg);..  
1c830 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
1c840 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20  contains a page 
1c850 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72  with page-number
1c860 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74   pgno, remove it
1c870 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20  .  ** from it's 
1c880 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
1c890 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e  , if the PgHdr.n
1c8a0 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20  eedSync was set 
1c8b0 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70  for .  ** page p
1c8c0 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27  gno before the '
1c8d0 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c  move' operation,
1c8e0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
1c8f0 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66  retained .  ** f
1c900 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65  or the page move
1c910 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  d there..  */.  
1c920 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c  pPgOld = pager_l
1c930 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
1c940 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  no);.  if( pPgOl
1c950 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
1c960 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30   pPgOld->nRef==0
1c970 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61   );.    unlinkHa
1c980 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
1c990 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67  pPgOld);.    pPg
1c9a0 4f 6c 64 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  Old->dirty = 0;.
1c9b0 20 20 20 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e      if( pPgOld->
1c9c0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
1c9d0 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
1c9e0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
1c9f0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1ca00 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  nal = 1;.      p
1ca10 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  Pg->needSync = 1
1ca20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ca30 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1ca40 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
1ca50 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70   /* Change the p
1ca60 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
1ca70 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  Pg and insert it
1ca80 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61   into the new ha
1ca90 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 70  sh-chain. */.  p
1caa0 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
1cab0 0a 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73  .  h = pager_has
1cac0 68 28 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  h(pgno);.  if( p
1cad0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
1cae0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1caf0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d  Pager->aHash[h]-
1cb00 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
1cb10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
1cb20 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
1cb30 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50   = pPg;.  }.  pP
1cb40 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
1cb50 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
1cb60 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  .  pPager->aHash
1cb70 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67  [h] = pPg;.  pPg
1cb80 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
1cb90 0a 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d  ..  pPg->dirty =
1cba0 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69   1;.  pPager->di
1cbb0 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20  rtyCache = 1;.. 
1cbc0 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e   if( needSyncPgn
1cbd0 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  o ){.    /* If n
1cbe0 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e  eedSyncPgno is n
1cbf0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
1cc00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
1cc10 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20  eeds to be .    
1cc20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  ** sync()ed befo
1cc30 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77  re any data is w
1cc40 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61  ritten to databa
1cc50 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65  se file page nee
1cc60 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a  dSyncPgno..    *
1cc70 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20  * Currently, no 
1cc80 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
1cc90 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
1cca0 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  he and the .    
1ccb0 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72  ** Pager.aInJour
1ccc0 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e  nal bit has been
1ccd0 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73   set. This needs
1cce0 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20   to be remedied 
1ccf0 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a  by loading.    *
1cd00 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  * the page into 
1cd10 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
1cd20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20  and setting the 
1cd30 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66  PgHdr.needSync f
1cd40 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
1cd50 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 70 61  ** The sqlite3pa
1cd60 67 65 72 5f 67 65 74 28 29 20 63 61 6c 6c 20 6d  ger_get() call m
1cd70 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
1cd80 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
1cd90 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
1cda0 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
1cdb0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
1cdc0 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
1cdd0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 76 6f 69   int rc;.    voi
1cde0 64 20 2a 70 4e 65 65 64 53 79 6e 63 3b 0a 20 20  d *pNeedSync;.  
1cdf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ce00 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
1ce10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1ce20 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
1ce30 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
1ce40 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 69  NeedSync);.    i
1ce50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ce60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ce70 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1ce80 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41  nc = 1;.    DATA
1ce90 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53  _TO_PGHDR(pNeedS
1cea0 79 6e 63 29 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ync)->needSync =
1ceb0 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f   1;.    DATA_TO_
1cec0 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29  PGHDR(pNeedSync)
1ced0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
1cee0 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48  .    DATA_TO_PGH
1cef0 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 64  DR(pNeedSync)->d
1cf00 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 73 71  irty = 1;.    sq
1cf10 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1cf20 28 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20 7d  (pNeedSync);.  }
1cf30 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1cf40 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
1cf50 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1cf60 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
1cf70 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1cf80 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
1cf90 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
1cfa0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63   of the file loc
1cfb0 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
1cfc0 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65  pager..** The re
1cfd0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e  turn value is on
1cfe0 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  e of NO_LOCK, SH
1cff0 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
1d000 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e  VED_LOCK,.** PEN
1d010 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58  DING_LOCK, or EX
1d020 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f  CLUSIVE_LOCK..*/
1d030 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1d040 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50 61 67 65  r_lockstate(Page
1d050 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1d060 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6f 2e 78  turn sqlite3Io.x
1d070 4c 6f 63 6b 53 74 61 74 65 28 70 50 61 67 65 72  LockState(pPager
1d080 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ->fd);.}.#endif.
1d090 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1d0a0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
1d0b0 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c   a listing of al
1d0c0 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  l referenced pag
1d0d0 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66  es and their ref
1d0e0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   count..*/.void 
1d0f0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
1d100 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67  dump(Pager *pPag
1d110 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
1d120 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  g;.  for(pPg=pPa
1d130 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
1d140 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
1d150 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  l){.    if( pPg-
1d160 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69  >nRef<=0 ) conti
1d170 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nue;.    sqlite3
1d180 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47  DebugPrintf("PAG
1d190 45 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52  E %3d addr=%p nR
1d1a0 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ef=%d\n", .     
1d1b0 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48    pPg->pgno, PGH
1d1c0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1d1d0 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d   pPg->nRef);.  }
1d1e0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69  .}.#endif..#endi
1d1f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1d200 5f 44 49 53 4b 49 4f 20 2a 2f 0a                 _DISKIO */.